summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllen Byrne <50328838+byrnHDF@users.noreply.github.com>2022-09-14 20:44:24 (GMT)
committerGitHub <noreply@github.com>2022-09-14 20:44:24 (GMT)
commit45178c87a3099a9fef8bae6f7249ca306cf89629 (patch)
treecb404581365434d641e4d6303921613ef3432bd0
parentdcf3b54b6ef3ffe2093cfae81fe80cdb2bb53047 (diff)
downloadhdf5-45178c87a3099a9fef8bae6f7249ca306cf89629.zip
hdf5-45178c87a3099a9fef8bae6f7249ca306cf89629.tar.gz
hdf5-45178c87a3099a9fef8bae6f7249ca306cf89629.tar.bz2
develop Merge doxygen from 1.12 branch (#2095)
-rw-r--r--CMakeLists.txt5
-rw-r--r--CTestConfig.cmake2
-rw-r--r--config/cmake/UseJava.cmake1
-rw-r--r--configure.ac6
-rw-r--r--doxygen/CMakeLists.txt5
-rw-r--r--doxygen/Doxyfile.in10
-rw-r--r--doxygen/aliases2
-rw-r--r--doxygen/dox/DDLBNF110.dox2
-rw-r--r--doxygen/dox/FileFormatSpec.dox23
-rw-r--r--doxygen/dox/GettingStarted.dox101
-rw-r--r--doxygen/dox/IntroHDF5.dox627
-rw-r--r--doxygen/dox/LearnBasics.dox183
-rw-r--r--doxygen/dox/LearnBasics1.dox1023
-rw-r--r--doxygen/dox/LearnBasics2.dox1159
-rw-r--r--doxygen/dox/LearnBasics3.dox1015
-rw-r--r--doxygen/dox/LearnHDFView.dox472
-rw-r--r--doxygen/dox/ReferenceManual.dox59
-rw-r--r--doxygen/dox/Specifications.dox16
-rw-r--r--doxygen/dox/TechnicalNotes.dox16
-rw-r--r--doxygen/dox/UsersGuide.dox403
-rw-r--r--doxygen/dox/ViewTools.dox1198
-rw-r--r--doxygen/dox/ViewTools2.dox786
-rw-r--r--doxygen/dox/ViewToolsJPSS.dox763
-rw-r--r--doxygen/dox/high_level/extension.dox543
-rw-r--r--doxygen/dox/high_level/high_level.dox29
-rw-r--r--doxygen/dox/rm-template.dox2
-rw-r--r--doxygen/examples/H5.format.1.0.html2
-rw-r--r--doxygen/examples/H5.format.1.1.html2
-rw-r--r--doxygen/examples/H5.format.2.0.html25576
-rw-r--r--doxygen/examples/H5.format.html2
-rw-r--r--doxygen/examples/ThreadSafeLibrary.html10
-rw-r--r--doxygen/examples/core_menu.md69
-rw-r--r--doxygen/examples/fortran_menu.md73
-rw-r--r--doxygen/examples/high_level_menu.md30
-rw-r--r--doxygen/examples/java_menu.md84
-rw-r--r--doxygen/hdf5doxy_layout.xml3
-rw-r--r--doxygen/img/DataGroup.pngbin0 -> 41665 bytes
-rw-r--r--doxygen/img/Dmodel_fig1.gifbin0 -> 13259 bytes
-rw-r--r--doxygen/img/Dmodel_fig10.gifbin0 -> 11552 bytes
-rw-r--r--doxygen/img/Dmodel_fig11_b.gifbin0 -> 13924 bytes
-rw-r--r--doxygen/img/Dmodel_fig12_a.gifbin0 -> 3182 bytes
-rw-r--r--doxygen/img/Dmodel_fig12_b.gifbin0 -> 4028 bytes
-rw-r--r--doxygen/img/Dmodel_fig14_a.gifbin0 -> 5367 bytes
-rw-r--r--doxygen/img/Dmodel_fig14_b.gifbin0 -> 6432 bytes
-rw-r--r--doxygen/img/Dmodel_fig14_c.gifbin0 -> 7397 bytes
-rw-r--r--doxygen/img/Dmodel_fig14_d.gifbin0 -> 9898 bytes
-rw-r--r--doxygen/img/Dmodel_fig2.gifbin0 -> 12024 bytes
-rw-r--r--doxygen/img/Dmodel_fig3_a.gifbin0 -> 7427 bytes
-rw-r--r--doxygen/img/Dmodel_fig3_c.gifbin0 -> 6800 bytes
-rw-r--r--doxygen/img/Dmodel_fig4_a.gifbin0 -> 4239 bytes
-rw-r--r--doxygen/img/Dmodel_fig4_b.gifbin0 -> 24587 bytes
-rw-r--r--doxygen/img/Dmodel_fig5.gifbin0 -> 7431 bytes
-rw-r--r--doxygen/img/Dmodel_fig6.gifbin0 -> 6497 bytes
-rw-r--r--doxygen/img/Dmodel_fig7_b.gifbin0 -> 26637 bytes
-rw-r--r--doxygen/img/Dmodel_fig8.gifbin0 -> 12217 bytes
-rw-r--r--doxygen/img/Dmodel_fig9.gifbin0 -> 14812 bytes
-rw-r--r--doxygen/img/Dsets_NbitFloating1.gifbin0 -> 6815 bytes
-rw-r--r--doxygen/img/Dsets_NbitFloating2.gifbin0 -> 9335 bytes
-rw-r--r--doxygen/img/Dsets_NbitInteger1.gifbin0 -> 6489 bytes
-rw-r--r--doxygen/img/Dsets_NbitInteger2.gifbin0 -> 10471 bytes
-rw-r--r--doxygen/img/Dsets_fig1.gifbin0 -> 10803 bytes
-rw-r--r--doxygen/img/Dsets_fig10.gifbin0 -> 6538 bytes
-rw-r--r--doxygen/img/Dsets_fig11.gifbin0 -> 21211 bytes
-rw-r--r--doxygen/img/Dsets_fig12.gifbin0 -> 36869 bytes
-rw-r--r--doxygen/img/Dsets_fig2.gifbin0 -> 18083 bytes
-rw-r--r--doxygen/img/Dsets_fig3.gifbin0 -> 27621 bytes
-rw-r--r--doxygen/img/Dsets_fig4.gifbin0 -> 41416 bytes
-rw-r--r--doxygen/img/Dsets_fig5.gifbin0 -> 15893 bytes
-rw-r--r--doxygen/img/Dsets_fig6.gifbin0 -> 2509 bytes
-rw-r--r--doxygen/img/Dsets_fig7.gifbin0 -> 2556 bytes
-rw-r--r--doxygen/img/Dsets_fig8.gifbin0 -> 2273 bytes
-rw-r--r--doxygen/img/Dsets_fig9.gifbin0 -> 4368 bytes
-rw-r--r--doxygen/img/Dspace_CvsF1.gifbin0 -> 8623 bytes
-rw-r--r--doxygen/img/Dspace_CvsF2.gifbin0 -> 8623 bytes
-rw-r--r--doxygen/img/Dspace_CvsF3.gifbin0 -> 8909 bytes
-rw-r--r--doxygen/img/Dspace_CvsF4.gifbin0 -> 8470 bytes
-rw-r--r--doxygen/img/Dspace_combine.gifbin0 -> 5101 bytes
-rw-r--r--doxygen/img/Dspace_complex.gifbin0 -> 6715 bytes
-rw-r--r--doxygen/img/Dspace_features.gifbin0 -> 89809 bytes
-rw-r--r--doxygen/img/Dspace_features_cmpd.gifbin0 -> 31274 bytes
-rw-r--r--doxygen/img/Dspace_move.gifbin0 -> 13255 bytes
-rw-r--r--doxygen/img/Dspace_point.gifbin0 -> 6697 bytes
-rw-r--r--doxygen/img/Dspace_read.gifbin0 -> 14238 bytes
-rw-r--r--doxygen/img/Dspace_select.gifbin0 -> 29452 bytes
-rw-r--r--doxygen/img/Dspace_separate.gifbin0 -> 9911 bytes
-rw-r--r--doxygen/img/Dspace_simple.gifbin0 -> 9709 bytes
-rw-r--r--doxygen/img/Dspace_subset.gifbin0 -> 4790 bytes
-rw-r--r--doxygen/img/Dspace_three_datasets.gifbin0 -> 10912 bytes
-rw-r--r--doxygen/img/Dspace_transfer.gifbin0 -> 15096 bytes
-rw-r--r--doxygen/img/Dspace_write1to2.gifbin0 -> 38748 bytes
-rw-r--r--doxygen/img/Dtypes_fig1.gifbin0 -> 8857 bytes
-rw-r--r--doxygen/img/Dtypes_fig10.gifbin0 -> 41804 bytes
-rw-r--r--doxygen/img/Dtypes_fig11.gifbin0 -> 79789 bytes
-rw-r--r--doxygen/img/Dtypes_fig12.gifbin0 -> 15692 bytes
-rw-r--r--doxygen/img/Dtypes_fig13a.gifbin0 -> 3350 bytes
-rw-r--r--doxygen/img/Dtypes_fig13b.gifbin0 -> 3571 bytes
-rw-r--r--doxygen/img/Dtypes_fig13c.gifbin0 -> 2629 bytes
-rw-r--r--doxygen/img/Dtypes_fig13d.gifbin0 -> 2769 bytes
-rw-r--r--doxygen/img/Dtypes_fig14.gifbin0 -> 50174 bytes
-rw-r--r--doxygen/img/Dtypes_fig15.gifbin0 -> 30871 bytes
-rw-r--r--doxygen/img/Dtypes_fig16.gifbin0 -> 5420 bytes
-rw-r--r--doxygen/img/Dtypes_fig16a.gifbin0 -> 10896 bytes
-rw-r--r--doxygen/img/Dtypes_fig16b.gifbin0 -> 6908 bytes
-rw-r--r--doxygen/img/Dtypes_fig16c.gifbin0 -> 6847 bytes
-rw-r--r--doxygen/img/Dtypes_fig16d.gifbin0 -> 9850 bytes
-rw-r--r--doxygen/img/Dtypes_fig17a.gifbin0 -> 13623 bytes
-rw-r--r--doxygen/img/Dtypes_fig17b.gifbin0 -> 30154 bytes
-rw-r--r--doxygen/img/Dtypes_fig18.gifbin0 -> 9037 bytes
-rw-r--r--doxygen/img/Dtypes_fig19.gifbin0 -> 12014 bytes
-rw-r--r--doxygen/img/Dtypes_fig2.gifbin0 -> 6099 bytes
-rw-r--r--doxygen/img/Dtypes_fig20a.gifbin0 -> 31836 bytes
-rw-r--r--doxygen/img/Dtypes_fig20b.gifbin0 -> 17044 bytes
-rw-r--r--doxygen/img/Dtypes_fig20c.gifbin0 -> 24983 bytes
-rw-r--r--doxygen/img/Dtypes_fig20d.gifbin0 -> 14435 bytes
-rw-r--r--doxygen/img/Dtypes_fig21.gifbin0 -> 56286 bytes
-rw-r--r--doxygen/img/Dtypes_fig22.gifbin0 -> 40000 bytes
-rw-r--r--doxygen/img/Dtypes_fig23.gifbin0 -> 61311 bytes
-rw-r--r--doxygen/img/Dtypes_fig24.gifbin0 -> 30529 bytes
-rw-r--r--doxygen/img/Dtypes_fig25a.gifbin0 -> 17268 bytes
-rw-r--r--doxygen/img/Dtypes_fig25c.gifbin0 -> 17238 bytes
-rw-r--r--doxygen/img/Dtypes_fig26.gifbin0 -> 14866 bytes
-rw-r--r--doxygen/img/Dtypes_fig27.gifbin0 -> 57099 bytes
-rw-r--r--doxygen/img/Dtypes_fig28.gifbin0 -> 49961 bytes
-rw-r--r--doxygen/img/Dtypes_fig3.gifbin0 -> 5654 bytes
-rw-r--r--doxygen/img/Dtypes_fig4.gifbin0 -> 14387 bytes
-rw-r--r--doxygen/img/Dtypes_fig5.gifbin0 -> 16959 bytes
-rw-r--r--doxygen/img/Dtypes_fig6.gifbin0 -> 52742 bytes
-rw-r--r--doxygen/img/Dtypes_fig7.gifbin0 -> 55938 bytes
-rw-r--r--doxygen/img/Dtypes_fig8.gifbin0 -> 20671 bytes
-rw-r--r--doxygen/img/Dtypes_fig9.gifbin0 -> 22036 bytes
-rw-r--r--doxygen/img/Files_fig3.gifbin0 -> 44382 bytes
-rw-r--r--doxygen/img/Files_fig4.gifbin0 -> 38862 bytes
-rw-r--r--doxygen/img/Groups_fig1.gifbin0 -> 5404 bytes
-rw-r--r--doxygen/img/Groups_fig10_a.gifbin0 -> 7745 bytes
-rw-r--r--doxygen/img/Groups_fig10_b.gifbin0 -> 6372 bytes
-rw-r--r--doxygen/img/Groups_fig10_c.gifbin0 -> 8308 bytes
-rw-r--r--doxygen/img/Groups_fig10_d.gifbin0 -> 12963 bytes
-rw-r--r--doxygen/img/Groups_fig11_a.gifbin0 -> 7349 bytes
-rw-r--r--doxygen/img/Groups_fig11_b.gifbin0 -> 7912 bytes
-rw-r--r--doxygen/img/Groups_fig11_c.gifbin0 -> 8589 bytes
-rw-r--r--doxygen/img/Groups_fig11_d.gifbin0 -> 9552 bytes
-rw-r--r--doxygen/img/Groups_fig2.gifbin0 -> 6187 bytes
-rw-r--r--doxygen/img/Groups_fig3.gifbin0 -> 5045 bytes
-rw-r--r--doxygen/img/Groups_fig4.gifbin0 -> 12187 bytes
-rw-r--r--doxygen/img/Groups_fig5.gifbin0 -> 10459 bytes
-rw-r--r--doxygen/img/Groups_fig6.gifbin0 -> 13979 bytes
-rw-r--r--doxygen/img/Groups_fig9_a.gifbin0 -> 6313 bytes
-rw-r--r--doxygen/img/Groups_fig9_aa.gifbin0 -> 7923 bytes
-rw-r--r--doxygen/img/Groups_fig9_b.gifbin0 -> 7352 bytes
-rw-r--r--doxygen/img/Groups_fig9_bb.gifbin0 -> 7336 bytes
-rw-r--r--doxygen/img/LBDsetSubRWProg.pngbin0 -> 18297 bytes
-rw-r--r--doxygen/img/Pmodel_fig2.gifbin0 -> 4411 bytes
-rw-r--r--doxygen/img/Pmodel_fig3.gifbin0 -> 39263 bytes
-rw-r--r--doxygen/img/Pmodel_fig5_a.gifbin0 -> 17234 bytes
-rw-r--r--doxygen/img/Pmodel_fig5_b.gifbin0 -> 20671 bytes
-rw-r--r--doxygen/img/Pmodel_fig5_c.gifbin0 -> 23897 bytes
-rw-r--r--doxygen/img/Pmodel_fig5_d.gifbin0 -> 23575 bytes
-rw-r--r--doxygen/img/Pmodel_fig5_e.gifbin0 -> 4304 bytes
-rw-r--r--doxygen/img/Pmodel_fig6.gifbin0 -> 11996 bytes
-rw-r--r--doxygen/img/PropListClassInheritance.gifbin0 -> 17349 bytes
-rw-r--r--doxygen/img/PropListEcosystem.gifbin0 -> 3720 bytes
-rw-r--r--doxygen/img/Shared_Attribute.jpgbin0 -> 37209 bytes
-rw-r--r--doxygen/img/StormDataset.pngbin0 -> 21441 bytes
-rw-r--r--doxygen/img/UML_Attribute.jpgbin0 -> 36134 bytes
-rw-r--r--doxygen/img/UML_FileAndProps.gifbin0 -> 6161 bytes
-rw-r--r--doxygen/img/VFL_Drivers.gifbin0 -> 17638 bytes
-rw-r--r--doxygen/img/cmpnddtype.pngbin0 -> 19354 bytes
-rw-r--r--doxygen/img/crtatt.pngbin0 -> 30414 bytes
-rw-r--r--doxygen/img/crtdset.pngbin0 -> 18200 bytes
-rw-r--r--doxygen/img/crtf-pic.pngbin0 -> 14322 bytes
-rw-r--r--doxygen/img/crtgrp.pngbin0 -> 15588 bytes
-rw-r--r--doxygen/img/dataset.pngbin0 -> 25110 bytes
-rw-r--r--doxygen/img/datasetwdata.pngbin0 -> 71012 bytes
-rw-r--r--doxygen/img/dataspace.pngbin0 -> 15883 bytes
-rw-r--r--doxygen/img/dataspace1.pngbin0 -> 11510 bytes
-rw-r--r--doxygen/img/datatype.pngbin0 -> 11848 bytes
-rw-r--r--doxygen/img/dtypes_fig25b.gifbin0 -> 6634 bytes
-rw-r--r--doxygen/img/fileobj.pngbin0 -> 108220 bytes
-rw-r--r--doxygen/img/group.pngbin0 -> 122668 bytes
-rw-r--r--doxygen/img/hdfview-anthrstrm-img.pngbin0 -> 68911 bytes
-rw-r--r--doxygen/img/hdfview-anthrstrm-sprdsht.pngbin0 -> 63861 bytes
-rw-r--r--doxygen/img/hdfview-anthrstrm.pngbin0 -> 46472 bytes
-rw-r--r--doxygen/img/hdfview-imgicon.pngbin0 -> 81394 bytes
-rw-r--r--doxygen/img/hdfview-imgprop.pngbin0 -> 83103 bytes
-rw-r--r--doxygen/img/hdfview-imgsubset.pngbin0 -> 82068 bytes
-rw-r--r--doxygen/img/hdfview-newcmpd.pngbin0 -> 100495 bytes
-rw-r--r--doxygen/img/hdfview-newimgsubset.pngbin0 -> 85051 bytes
-rw-r--r--doxygen/img/hdfview-prop.pngbin0 -> 114672 bytes
-rw-r--r--doxygen/img/hdfview-qf.pngbin0 -> 170686 bytes
-rw-r--r--doxygen/img/hdfview-regref.pngbin0 -> 231317 bytes
-rw-r--r--doxygen/img/hdfview-regref1.pngbin0 -> 134813 bytes
-rw-r--r--doxygen/img/hdfview-regref2.pngbin0 -> 195189 bytes
-rw-r--r--doxygen/img/hdfview-regrefval.pngbin0 -> 56209 bytes
-rw-r--r--doxygen/img/hdfview-table.pngbin0 -> 61329 bytes
-rw-r--r--doxygen/img/hdfview-tree.pngbin0 -> 38283 bytes
-rw-r--r--doxygen/img/imgLBDsetCreate.gifbin0 -> 954 bytes
-rw-r--r--doxygen/img/imgLBDsetSubRW11.pngbin0 -> 23645 bytes
-rw-r--r--doxygen/img/imgLBDsetSubRW12.pngbin0 -> 25324 bytes
-rw-r--r--doxygen/img/imgLBDsetSubRW31.pngbin0 -> 17212 bytes
-rw-r--r--doxygen/img/imgLBDsetSubRW32.pngbin0 -> 18201 bytes
-rw-r--r--doxygen/img/imgLBDsetSubRW33.pngbin0 -> 17781 bytes
-rw-r--r--doxygen/img/imgLBFile.gifbin0 -> 635 bytes
-rw-r--r--doxygen/img/imggrpcreate.gifbin0 -> 928 bytes
-rw-r--r--doxygen/img/imggrpdsets.gifbin0 -> 1812 bytes
-rw-r--r--doxygen/img/imggrps.gifbin0 -> 1644 bytes
-rw-r--r--doxygen/img/newgroupimage.pngbin0 -> 44700 bytes
-rw-r--r--doxygen/img/noattrs.pngbin0 -> 43386 bytes
-rw-r--r--doxygen/img/properties.pngbin0 -> 50472 bytes
-rw-r--r--doxygen/img/scarletletter.pngbin0 -> 51013 bytes
-rw-r--r--doxygen/img/showasimage.pngbin0 -> 66016 bytes
-rw-r--r--doxygen/img/storm.pngbin0 -> 41590 bytes
-rw-r--r--doxygen/img/tutr-lochk.pngbin0 -> 9419 bytes
-rw-r--r--doxygen/img/tutr-lochks.pngbin0 -> 9652 bytes
-rw-r--r--doxygen/img/tutr-locons.pngbin0 -> 8133 bytes
-rwxr-xr-xdoxygen/img/vol_architecture.pngbin0 -> 46329 bytes
-rw-r--r--fortran/src/H5Aff.F906
-rw-r--r--fortran/src/H5Dff.F9052
-rw-r--r--fortran/src/H5Fff.F9010
-rw-r--r--fortran/src/H5Lff.F9015
-rw-r--r--fortran/src/H5Off.F901
-rw-r--r--fortran/src/H5Pff.F9028
-rw-r--r--fortran/src/H5Rff.F909
-rw-r--r--fortran/src/H5Sff.F904
-rw-r--r--fortran/src/H5Tff.F904
-rw-r--r--fortran/src/H5VLff.F902
-rw-r--r--fortran/src/H5Zff.F907
-rw-r--r--fortran/src/H5_buildiface.F904
-rw-r--r--fortran/src/H5_ff.F908
-rw-r--r--hl/fortran/src/H5DSff.F9025
-rw-r--r--hl/fortran/src/H5IMff.F9030
-rw-r--r--hl/fortran/src/H5LTff.F9030
-rw-r--r--hl/fortran/src/H5TBff.F9036
-rw-r--r--hl/src/H5DOpublic.h6
-rw-r--r--hl/src/H5DSpublic.h28
-rw-r--r--hl/src/H5IMpublic.h8
-rw-r--r--hl/src/H5LDpublic.h6
-rw-r--r--hl/src/H5LTpublic.h128
-rw-r--r--hl/src/H5PTpublic.h8
-rw-r--r--hl/src/H5TBpublic.h8
-rw-r--r--java/examples/groups/H5Ex_G_Visit.java2
-rw-r--r--java/src/Makefile.am3
-rw-r--r--java/src/hdf/hdf5lib/CMakeLists.txt1
-rw-r--r--java/src/hdf/hdf5lib/H5.java3529
-rw-r--r--java/src/hdf/hdf5lib/HDF5Constants.java13
-rw-r--r--java/src/hdf/hdf5lib/HDF5GroupInfo.java182
-rw-r--r--java/src/hdf/hdf5lib/HDFArray.java7
-rw-r--r--java/src/hdf/hdf5lib/HDFNativeData.java7
-rw-r--r--java/src/hdf/hdf5lib/callbacks/Callbacks.java6
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java2
-rw-r--r--java/src/hdf/hdf5lib/callbacks/package-info.java1
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5Exception.java18
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5IdException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java8
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java50
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java6
-rw-r--r--java/src/hdf/hdf5lib/exceptions/package-info.java1
-rw-r--r--java/src/hdf/hdf5lib/package-info.java114
-rw-r--r--java/src/hdf/overview.html10
-rw-r--r--java/src/jni/exceptionImp.c12
-rw-r--r--java/src/jni/exceptionImp.h2
-rw-r--r--java/src/jni/h5Constants.c5
-rw-r--r--java/test/TestH5.java2
-rw-r--r--release_docs/RELEASE.txt6
-rw-r--r--src/H5ACpublic.h2
-rw-r--r--src/H5Amodule.h346
-rw-r--r--src/H5Dmodule.h2956
-rw-r--r--src/H5Dpublic.h2
-rw-r--r--src/H5ESmodule.h88
-rw-r--r--src/H5Emodule.h514
-rw-r--r--src/H5Epublic.h8
-rw-r--r--src/H5Fmodule.h1443
-rw-r--r--src/H5Gmodule.h924
-rw-r--r--src/H5Gpublic.h10
-rw-r--r--src/H5Imodule.h7
-rw-r--r--src/H5Lmodule.h7
-rw-r--r--src/H5Mmodule.h16
-rw-r--r--src/H5Omodule.h7
-rw-r--r--src/H5Opublic.h6
-rw-r--r--src/H5PLmodule.h9
-rw-r--r--src/H5Pmodule.h960
-rw-r--r--src/H5Ppublic.h80
-rw-r--r--src/H5Rmodule.h27
-rw-r--r--src/H5Smodule.h1492
-rw-r--r--src/H5Tmodule.h3832
-rw-r--r--src/H5VLmodule.h92
-rw-r--r--src/H5Zmodule.h7
-rw-r--r--src/H5module.h1404
322 files changed, 38360 insertions, 14783 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0a0e4ca..35b345c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,6 +12,11 @@ if (POLICY CMP0083)
cmake_policy (SET CMP0083 NEW)
endif ()
+# Avoid warning about DOWNLOAD_EXTRACT_TIMESTAMP in CMake 3.24:
+if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
+ cmake_policy(SET CMP0135 NEW)
+endif()
+
#-----------------------------------------------------------------------------
# Instructions for use : Normal Build
#
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
index 514a9d6..b780b86 100644
--- a/CTestConfig.cmake
+++ b/CTestConfig.cmake
@@ -12,7 +12,7 @@
## This file should be placed in the root directory of your project.
## Then modify the CMakeLists.txt file in the root directory of your
## project to incorporate the testing dashboard.
-## # The following are required to use Dart and the CDash dashboard.
+## # The following are required to use Dart and the CDash dashboard
## ENABLE_TESTING()
## INCLUDE(CTest)
set (CTEST_PROJECT_NAME "HDF5")
diff --git a/config/cmake/UseJava.cmake b/config/cmake/UseJava.cmake
index 2351ce8..1de08db 100644
--- a/config/cmake/UseJava.cmake
+++ b/config/cmake/UseJava.cmake
@@ -1448,6 +1448,7 @@ function(create_javadoc _target)
add_custom_target(${_target}_javadoc ALL
COMMAND ${Java_JAVADOC_EXECUTABLE}
+ -Xdoclint:none
${_javadoc_options}
${_javadoc_files}
${_javadoc_packages}
diff --git a/configure.ac b/configure.ac
index e2fbf04..ab177fc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1213,6 +1213,7 @@ if test "X$HDF5_DOXYGEN" = "Xyes"; then
AC_SUBST([DOXYGEN_PACKAGE])
AC_SUBST([DOXYGEN_VERSION_STRING])
+ AC_SUBST([DOXYGEN_DIR])
AC_SUBST([DOXYGEN_INCLUDE_ALIASES])
AC_SUBST([DOXYGEN_PROJECT_LOGO])
AC_SUBST([DOXYGEN_PROJECT_BRIEF])
@@ -1237,6 +1238,7 @@ if test "X$HDF5_DOXYGEN" = "Xyes"; then
# SRCDIR Environment variables used inside doxygen macro for the source location:
DOXYGEN_PACKAGE=${PACKAGE_NAME}
DOXYGEN_VERSION_STRING=${PACKAGE_VERSION}
+ DOXYGEN_DIR='$(SRCDIR)/doxygen'
DOXYGEN_INCLUDE_ALIASES='$(SRCDIR)/doxygen/aliases'
DOXYGEN_PROJECT_LOGO='$(SRCDIR)/doxygen/img/HDFG-logo.png'
DOXYGEN_PROJECT_BRIEF=''
@@ -1249,14 +1251,14 @@ if test "X$HDF5_DOXYGEN" = "Xyes"; then
DOXYGEN_HTML_HEADER='$(SRCDIR)/doxygen/hdf5_header.html'
DOXYGEN_HTML_FOOTER='$(SRCDIR)/doxygen/hdf5_footer.html'
DOXYGEN_HTML_EXTRA_STYLESHEET='$(SRCDIR)/doxygen/hdf5doxy.css'
- DOXYGEN_HTML_EXTRA_FILES='$(SRCDIR)/doxygen/hdf5_navtree_hacks.js $(SRCDIR)/doxygen/img/FF-IH_FileGroup.gif $(SRCDIR)/doxygen/img/FF-IH_FileObject.gif $(SRCDIR)/doxygen/img/FileFormatSpecChunkDiagram.jpg $(SRCDIR)/doxygen/img/ftv2node.png $(SRCDIR)/doxygen/img/ftv2pnode.png $(SRCDIR)/doxygen/img/HDFG-logo.png $(SRCDIR)/doxygen/img/IOFlow2.gif $(SRCDIR)/doxygen/img/IOFlow3.gif $(SRCDIR)/doxygen/img/IOFlow.gif $(SRCDIR)/doxygen/img/PaletteExample1.gif $(SRCDIR)/doxygen/img/Palettes.fm.anc.gif'
+ DOXYGEN_HTML_EXTRA_FILES='$(SRCDIR)/doxygen/hdf5_navtree_hacks.js'
DOXYGEN_TAG_FILE=hdf5.tag
DOXYGEN_SERVER_BASED_SEARCH=NO
DOXYGEN_EXTERNAL_SEARCH=NO
DOXYGEN_SEARCHENGINE_URL=
DOXYGEN_STRIP_FROM_PATH='$(SRCDIR)'
DOXYGEN_STRIP_FROM_INC_PATH='$(SRCDIR)'
- DOXYGEN_PREDEFINED='H5_HAVE_DIRECT H5_HAVE_LIBHDFS H5_HAVE_MAP_API H5_HAVE_PARALLEL H5_HAVE_ROS3_VFD'
+ DOXYGEN_PREDEFINED='H5_HAVE_DIRECT H5_HAVE_LIBHDFS H5_HAVE_MAP_API H5_HAVE_PARALLEL H5_HAVE_ROS3_VFD H5_DOXYGEN_FORTRAN'
DX_INIT_DOXYGEN([HDF5], [./doxygen/Doxyfile], [hdf5lib_docs])
fi
diff --git a/doxygen/CMakeLists.txt b/doxygen/CMakeLists.txt
index c1a2071..86d34a3 100644
--- a/doxygen/CMakeLists.txt
+++ b/doxygen/CMakeLists.txt
@@ -7,11 +7,12 @@ project (HDF5_DOXYGEN C)
if (DOXYGEN_FOUND)
set (DOXYGEN_PACKAGE ${HDF5_PACKAGE_NAME})
set (DOXYGEN_VERSION_STRING ${HDF5_PACKAGE_VERSION_STRING})
+ set (DOXYGEN_DIR ${HDF5_DOXYGEN_DIR})
set (DOXYGEN_INCLUDE_ALIASES_PATH ${HDF5_DOXYGEN_DIR})
set (DOXYGEN_INCLUDE_ALIASES aliases)
set (DOXYGEN_VERBATIM_VARS DOXYGEN_INCLUDE_ALIASES)
set (DOXYGEN_PROJECT_LOGO ${HDF5_DOXYGEN_DIR}/img/HDFG-logo.png)
- set (DOXYGEN_PROJECT_BRIEF "C-API Reference")
+ set (DOXYGEN_PROJECT_BRIEF "API Reference")
set (DOXYGEN_INPUT_DIRECTORY "${HDF5_SOURCE_DIR} ${HDF5_DOXYGEN_DIR}/dox ${HDF5_GENERATED_SOURCE_DIR}")
set (DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES)
set (DOXYGEN_MACRO_EXPANSION YES)
@@ -28,7 +29,7 @@ if (DOXYGEN_FOUND)
set (DOXYGEN_SEARCHENGINE_URL)
set (DOXYGEN_STRIP_FROM_PATH ${HDF5_SOURCE_DIR})
set (DOXYGEN_STRIP_FROM_INC_PATH ${HDF5_SOURCE_DIR})
- set (DOXYGEN_PREDEFINED "H5_HAVE_DIRECT H5_HAVE_LIBHDFS H5_HAVE_MAP_API H5_HAVE_PARALLEL H5_HAVE_ROS3_VFD H5_HAVE_SUBFILING_VFD H5_HAVE_IOC_VFD")
+ set (DOXYGEN_PREDEFINED "H5_HAVE_DIRECT H5_HAVE_LIBHDFS H5_HAVE_MAP_API H5_HAVE_PARALLEL H5_HAVE_ROS3_VFD H5_DOXYGEN_FORTRAN H5_HAVE_SUBFILING_VFD H5_HAVE_IOC_VFD")
# This configure and individual custom targets work together
# Replace variables inside @@ with the current values
diff --git a/doxygen/Doxyfile.in b/doxygen/Doxyfile.in
index 7657fa5..08f5545 100644
--- a/doxygen/Doxyfile.in
+++ b/doxygen/Doxyfile.in
@@ -280,13 +280,13 @@ OPTIMIZE_OUTPUT_FOR_C = YES
# qualified scopes will look different, etc.
# The default value is: NO.
-OPTIMIZE_OUTPUT_JAVA = NO
+OPTIMIZE_OUTPUT_JAVA = YES
# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
# sources. Doxygen will then generate output that is tailored for Fortran.
# The default value is: NO.
-OPTIMIZE_FOR_FORTRAN = NO
+OPTIMIZE_FOR_FORTRAN = YES
# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
# sources. Doxygen will then generate output that is tailored for VHDL.
@@ -875,7 +875,11 @@ FILE_PATTERNS = H5*public.h \
H5VLconnector.h \
H5VLconnector_passthru.h \
H5VLnative.h \
+ H5Zdevelop.h \
H5version.h \
+ H5*.java \
+ HDF*.java \
+ *.F90 \
*.dox
# The RECURSIVE tag can be used to specify whether or not subdirectories should
@@ -944,7 +948,7 @@ EXAMPLE_RECURSIVE = NO
# that contain images that are to be included in the documentation (see the
# \image command).
-IMAGE_PATH = @HDF5_DOXYGEN_DIR@/img
+IMAGE_PATH = @DOXYGEN_DIR@/img
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
diff --git a/doxygen/aliases b/doxygen/aliases
index 6730be5..5ee60d5 100644
--- a/doxygen/aliases
+++ b/doxygen/aliases
@@ -379,4 +379,4 @@ ALIASES += obj_info_fields="<table><tr><th>Flag</th><th>Purpose</th></tr><tr><td
ALIASES += fortran_error="Returns 0 if successful and -1 if it fails."
ALIASES += fortran_approved="The preferred API, Fortran 2003 version."
-ALIASES += fortran_obsolete="Obsolete API, use the Fortran 2003 version instead." \ No newline at end of file
+ALIASES += fortran_obsolete="Obsolete API, use the Fortran 2003 version instead."
diff --git a/doxygen/dox/DDLBNF110.dox b/doxygen/dox/DDLBNF110.dox
index f7e4267..6d6b67e 100644
--- a/doxygen/dox/DDLBNF110.dox
+++ b/doxygen/dox/DDLBNF110.dox
@@ -126,7 +126,7 @@ This section contains a brief explanation of the symbols used in the DDL.
<reference> ::= H5T_REFERENCE { <ref_type> }
-<ref_type> ::= H5T_STD_REF_OBJECT | H5T_STD_REF_DSETREG | H5T_STD_REF | UNDEFINED
+<ref_type> ::= H5T_STD_REF_OBJECT | H5T_STD_REF_DSETREG
<compound_type> ::= H5T_COMPOUND {
<member_type_def>+
diff --git a/doxygen/dox/FileFormatSpec.dox b/doxygen/dox/FileFormatSpec.dox
new file mode 100644
index 0000000..fc10574
--- /dev/null
+++ b/doxygen/dox/FileFormatSpec.dox
@@ -0,0 +1,23 @@
+/** \page FMT3 HDF5 File Format Specification Version 3.0
+
+\htmlinclude H5.format.html
+
+*/
+
+/** \page FMT2 HDF5 File Format Specification Version 2.0
+
+\htmlinclude H5.format.2.0.html
+
+*/
+
+/** \page FMT11 HDF5 File Format Specification Version 1.1
+
+\htmlinclude H5.format.1.1.html
+
+*/
+
+/** \page FMT1 HDF5 File Format Specification Version 1.0
+
+\htmlinclude H5.format.1.0.html
+
+*/ \ No newline at end of file
diff --git a/doxygen/dox/GettingStarted.dox b/doxygen/dox/GettingStarted.dox
index 880491d..29c5033 100644
--- a/doxygen/dox/GettingStarted.dox
+++ b/doxygen/dox/GettingStarted.dox
@@ -1,3 +1,100 @@
-/** \page GettingStarted \Code{Hello, HDF5!}
+/** @page GettingStarted Getting Started with HDF5
- */ \ No newline at end of file
+Navigate back: \ref index "Main"
+<hr>
+
+\section sec_learn Learning HDF5
+There are several resources for learning about HDF5. The HDF Group provides an on-line HDF5 tutorial,
+documentation, examples, and videos. There are also tutorials provided by other organizations that are very useful for learning about HDF5.
+
+\subsection subsec_learn_intro The HDF Group Resources
+For a quick introduction to HDF5 see the following:
+<table>
+<tr>
+<td style="background-color:#F5F5F5">
+@ref IntroHDF5
+</td>
+<td>
+A very brief introduction to HDF5 and the HDF5 programming model and APIs
+</td>
+</tr>
+<tr>
+<td style="background-color:#F5F5F5">
+@ref LearnHDFView
+</td>
+<td>
+A tutorial for learning how to use HDFView. NO programming involved!
+</td>
+</tr>
+<tr>
+<td style="background-color:#F5F5F5">
+@ref LearnBasics
+</td>
+<td>
+Step by step instructions for learning HDF5 that include programming examples
+</td>
+</tr>
+</table>
+
+\subsection subsec_learn_tutor The HDF Group Tutorials and Examples
+These tutorials and examples are available for learning about the HDF5 High Level APIs, tools,
+Parallel HDF5, and the HDF5-1.10 VDS and SWMR new features:
+<table>
+<tr>
+<td style="background-color:#F5F5F5">
+<a href="https://portal.hdfgroup.org/display/HDF5/Introduction+to+the+HDF5+High+Level+APIs">Using the High Level APIs</a>
+</td>
+<td>
+\ref H5LT \ref H5IM \ref H5TB \ref H5PT \ref H5DS
+</td>
+</tr>
+<tr>
+<td style="background-color:#F5F5F5">
+<a href="https://portal.hdfgroup.org/display/HDF5/Introduction+to+Parallel+HDF5">Introduction to Parallel HDF5</a>
+</td>
+<td>
+A brief introduction to Parallel HDF5. If you are new to HDF5 please see the @ref LearnBasics topic first.
+</td>
+</tr>
+<tr>
+<td style="background-color:#F5F5F5">
+\ref ViewTools
+</td>
+<td>
+\li @ref LearnHDFView
+\li @ref ViewToolsCommand
+\li @ref ViewToolsJPSS
+</td>
+</tr>
+<tr>
+<td style="background-color:#F5F5F5">
+HDF5-1.10 New Features
+</td>
+<td>
+\li <a href="https://portal.hdfgroup.org/display/HDF5/Introduction+to+the+Virtual+Dataset++-+VDS">Introduction to the Virtual Dataset - VDS</a>
+\li <a href="https://portal.hdfgroup.org/pages/viewpage.action?pageId=48812567">Introduction to Single-Writer/Multiple-Reader (SWMR)</a>
+</td>
+</tr>
+<tr>
+<td style="background-color:#F5F5F5">
+Example Programs
+</td>
+<td>
+\ref HDF5Examples
+</td>
+</tr>
+<tr>
+<td style="background-color:#F5F5F5">
+Videos
+</td>
+<td>
+\li <a href="https://www.youtube.com/watch?v=BAjsCldRMMc">Introduction to HDF5</a>
+\li <a href="https://www.youtube.com/watch?v=qrI27pI0P1E">Parallel HDF5</a>
+</td>
+</tr>
+</table>
+
+<hr>
+Navigate back: \ref index "Main"
+
+*/
diff --git a/doxygen/dox/IntroHDF5.dox b/doxygen/dox/IntroHDF5.dox
new file mode 100644
index 0000000..ec46217
--- /dev/null
+++ b/doxygen/dox/IntroHDF5.dox
@@ -0,0 +1,627 @@
+/** @page IntroHDF5 Introduction to HDF5
+
+Navigate back: \ref index "Main" / \ref GettingStarted
+<hr>
+
+\section sec_intro_desc HDF5 Description
+HDF5 consists of a file format for storing HDF5 data, a data model for logically organizing and accessing
+HDF5 data from an application, and the software (libraries, language interfaces, and tools) for working with this format.
+
+\subsection subsec_intro_desc_file File Format
+HDF5 consists of a file format for storing HDF5 data, a data model for logically organizing and accessing HDF5 data from an application,
+and the software (libraries, language interfaces, and tools) for working with this format.
+
+\subsection subsec_intro_desc_dm Data Model
+The HDF5 Data Model, also known as the HDF5 Abstract (or Logical) Data Model consists of
+the building blocks for data organization and specification in HDF5.
+
+An HDF5 file (an object in itself) can be thought of as a container (or group) that holds
+a variety of heterogeneous data objects (or datasets). The datasets can be images, tables,
+graphs, and even documents, such as PDF or Excel:
+
+<table>
+<tr>
+<td>
+\image html fileobj.png
+</td>
+</tr>
+</table>
+
+The two primary objects in the HDF5 Data Model are groups and datasets.
+
+There are also a variety of other objects in the HDF5 Data Model that support groups and datasets,
+including datatypes, dataspaces, properties and attributes.
+
+\subsubsection subsec_intro_desc_dm_group Groups
+HDF5 groups (and links) organize data objects. Every HDF5 file contains a root group that can
+contain other groups or be linked to objects in other files.
+
+<table>
+<caption>There are two groups in the HDF5 file depicted above: Viz and SimOut.
+Under the Viz group are a variety of images and a table that is shared with the SimOut group.
+The SimOut group contains a 3-dimensional array, a 2-dimensional array and a link to a 2-dimensional
+array in another HDF5 file.</caption>
+<tr>
+<td>
+\image html group.png
+</td>
+</tr>
+</table>
+
+Working with groups and group members is similar in many ways to working with directories and files
+in UNIX. As with UNIX directories and files, objects in an HDF5 file are often described by giving
+their full (or absolute) path names.
+\li / signifies the root group.
+\li /foo signifies a member of the root group called foo.
+\li /foo/zoo signifies a member of the group foo, which in turn is a member of the root group.
+
+\subsubsection subsec_intro_desc_dm_dset Datasets
+HDF5 datasets organize and contain the “raw” data values. A dataset consists of metadata
+that describes the data, in addition to the data itself:
+
+<table>
+<caption>In this picture, the data is stored as a three dimensional dataset of size 4 x 5 x 6 with an integer datatype.
+It contains attributes, Time and Pressure, and the dataset is chunked and compressed.</caption>
+<tr>
+<td>
+\image html dataset.png
+</td>
+</tr>
+</table>
+
+Datatypes, dataspaces, properties and (optional) attributes are HDF5 objects that describe a dataset.
+The datatype describes the individual data elements.
+
+\subsection subsec_intro_desc_props Datatypes, Dataspaces, Properties and Attributes
+
+\subsubsection subsec_intro_desc_prop_dtype Datatypes
+The datatype describes the individual data elements in a dataset. It provides complete information for
+data conversion to or from that datatype.
+
+<table>
+<caption>In the dataset depicted, each element of the dataset is a 32-bit integer.</caption>
+<tr>
+<td>
+\image html datatype.png
+</td>
+</tr>
+</table>
+
+Datatypes in HDF5 can be grouped into:
+<ul>
+<li>
+<b>Pre-Defined Datatypes</b>: These are datatypes that are created by HDF5. They are actually opened (and closed)
+by HDF5 and can have different values from one HDF5 session to the next. There are two types of pre-defined datatypes:
+<ul>
+<li>
+Standard datatypes are the same on all platforms and are what you see in an HDF5 file. Their names are of the form
+H5T_ARCH_BASE where ARCH is an architecture name and BASE is a pro­gramming type name. For example, #H5T_IEEE_F32BE
+indicates a standard Big Endian floating point type.
+</li>
+<li>
+Native datatypes are used to simplify memory operations (reading, writing) and are NOT the same on different platforms.
+For example, #H5T_NATIVE_INT indicates an int (C).
+</li>
+</ul>
+</li>
+<li>
+<b>Derived Datatypes</b>: These are datatypes that are created or derived from the pre-defined datatypes.
+An example of a commonly used derived datatype is a string of more than one character. Compound datatypes
+are also derived types. A compound datatype can be used to create a simple table, and can also be nested,
+in which it includes one more other compound datatypes.
+<table>
+<caption>This is an example of a dataset with a compound datatype. Each element in the dataset consists
+of a 16-bit integer, a character, a 32-bit integer, and a 2x3x2 array of 32-bit floats (the datatype).
+It is a 2-dimensional 5 x 3 array (the dataspace). The datatype should not be confused with the dataspace.
+</caption>
+<tr>
+<td>
+\image html cmpnddtype.png
+</td>
+</tr>
+</table>
+</li>
+</ul>
+
+\subsubsection subsec_intro_desc_prop_dspace Dataspaces
+A dataspace describes the layout of a dataset’s data elements. It can consist of no elements (NULL),
+a single element (scalar), or a simple array.
+
+<table>
+<caption>This image illustrates a dataspace that is an array with dimensions of 5 x 3 and a rank (number of dimensions) of 2.</caption>
+<tr>
+<td>
+\image html dataspace1.png
+</td>
+</tr>
+</table>
+
+A dataspace can have dimensions that are fixed (unchanging) or unlimited, which means they can grow
+in size (i.e. they are extendible).
+
+There are two roles of a dataspace:
+\li It contains the spatial information (logical layout) of a dataset stored in a file. This includes the rank and dimensions of a dataset, which are a permanent part of the dataset definition.
+\li It describes an application’s data buffers and data elements participating in I/O. In other words, it can be used to select a portion or subset of a dataset.
+
+<table>
+<caption>The dataspace is used to describe both the logical layout of a dataset and a subset of a dataset.</caption>
+<tr>
+<td>
+\image html dataspace.png
+</td>
+</tr>
+</table>
+
+\subsubsection subsec_intro_desc_prop_property Properties
+A property is a characteristic or feature of an HDF5 object. There are default properties which
+handle the most common needs. These default properties can be modified using the HDF5 Property
+List API to take advantage of more powerful or unusual features of HDF5 objects.
+
+<table>
+<tr>
+<td>
+\image html properties.png
+</td>
+</tr>
+</table>
+
+For example, the data storage layout property of a dataset is contiguous by default. For better
+performance, the layout can be modified to be chunked or chunked and compressed:
+
+\subsubsection subsec_intro_desc_prop_attr Attributes
+Attributes can optionally be associated with HDF5 objects. They have two parts: a name and a value.
+Attributes are accessed by opening the object that they are attached to so are not independent objects.
+Typically an attribute is small in size and contains user metadata about the object that it is attached to.
+
+Attributes look similar to HDF5 datasets in that they have a datatype and dataspace. However, they
+do not support partial I/O operations, and they cannot be compressed or extended.
+
+\subsection subsec_intro_desc_soft HDF5 Software
+The HDF5 software is written in C and includes optional wrappers for C++, FORTRAN (90 and F2003),
+and Java. The HDF5 binary distribution consists of the HDF5 libraries, include files, command-line
+utilities, scripts for compiling applications, and example programs.
+
+\subsubsection subsec_intro_desc_soft_apis HDF5 APIs and Libraries
+There are APIs for each type of object in HDF5. For example, all C routines in the HDF5 library
+begin with a prefix of the form H5*, where * is one or two uppercase letters indicating the type
+of object on which the function operates:
+\li @ref H5A <b>A</b>ttribute Interface
+\li @ref H5D <b>D</b>ataset Interface
+\li @ref H5F <b>F</b>ile Interface
+
+The HDF5 High Level APIs simplify many of the steps required to create and access objects, as well
+as providing templates for storing objects. Following is a list of the High Level APIs:
+\li @ref H5LT – simplifies steps in creating datasets and attributes
+\li @ref H5IM – defines a standard for storing images in HDF5
+\li @ref H5TB – condenses the steps required to create tables
+\li @ref H5DS – provides a standard for dimension scale storage
+\li @ref H5PT – provides a standard for storing packet data
+
+\subsubsection subsec_intro_desc_soft_tools Tools
+Useful tools for working with HDF5 files include:
+\li h5dump: A utility to dump or display the contents of an HDF5 File
+\li h5cc, h5c++, h5fc: Unix scripts for compiling applications
+\li HDFView: A java browser to view HDF (HDF4 and HDF5) files
+
+<h4>h5dump</h4>
+The h5dump utility displays the contents of an HDF5 file in Data Description Language (\ref DDLBNF110).
+Below is an example of h5dump output for an HDF5 file that contains no objects:
+\code
+$ h5dump file.h5
+ HDF5 "file.h5" {
+ GROUP "/" {
+ }
+ }
+\endcode
+
+With large files and datasets the output from h5dump can be overwhelming.
+There are options that can be used to examine specific parts of an HDF5 file.
+Some useful h5dump options are included below:
+\code
+ -H, --header Display header information only (no data)
+ -d <name> Display a dataset with a specified path and name
+ -p Display properties
+ -n Display the contents of the file
+\endcode
+
+<h4>h5cc, h5fc, h5c++</h4>
+The built HDF5 binaries include the h5cc, h5fc, h5c++ compile scripts for compiling applications.
+When using these scripts there is no need to specify the HDF5 libraries and include files.
+Compiler options can be passed to the scripts.
+
+<h4>HDFView</h4>
+The HDFView tool allows browsing of data in HDF (HDF4 and HDF5) files.
+
+\section sec_intro_pm Introduction to the HDF5 Programming Model and APIs
+The HDF5 Application Programming Interface is extensive, but a few functions do most of the work.
+
+To introduce the programming model, examples in Python and C are included below. The Python examples
+use the HDF5 Python APIs (h5py). See the Examples from "Learning the Basics" page for complete examples
+that can be downloaded and run for C, FORTRAN, C++, Java and Python.
+
+The general paradigm for working with objects in HDF5 is to:
+\li Open the object.
+\li Access the object.
+\li Close the object.
+
+The library imposes an order on the operations by argument dependencies. For example, a file must be
+opened before a dataset because the dataset open call requires a file handle as an argument. Objects
+can be closed in any order. However, once an object is closed it no longer can be accessed.
+
+Keep the following in mind when looking at the example programs included in this section:
+<ul>
+<li>
+<ul>
+<li>
+C routines begin with the prefix “H5*” where * is a single letter indicating the object on which the
+operation is to be performed.
+</li>
+<li>
+FORTRAN routines are similar; they begin with “h5*” and end with “_f”.
+</li>
+<li>
+Java routines are similar; the routine names begin with “H5*” and are prefixed with “H5.” as the class. Constants are
+in the HDF5Constants class and are prefixed with "HDF5Constants.". The function arguments
+are usually similar, @see @ref HDF5LIB
+</li>
+</ul>
+For example:
+<ul>
+<li>
+File Interface:<ul><li>#H5Fopen (C)</li><li>h5fopen_f (FORTRAN)</li><li>H5.H5Fopen (Java)</li></ul>
+</li>
+<li>
+Dataset Interface:<ul><li>#H5Dopen (C)</li><li>h5dopen_f (FORTRAN)</li><li>H5.H5Dopen (Java)</li></ul>
+</li>
+<li>
+Dataspace interface:<ul><li>#H5Sclose (C)</li><li>h5sclose_f (FORTRAN)</li><li>H5.H5Sclose (Java)</li></ul>
+</li>
+</ul>
+The HDF5 Python APIs use methods associated with specific objects.
+</li>
+<li>
+For portability, the HDF5 library has its own defined types. Some common types that you will see
+in the example code are:
+<ul>
+<li>
+#hid_t is used for object handles
+</li>
+<li>
+hsize_t is used for dimensions
+</li>
+<li>
+#herr_t is used for many return values
+</li>
+</ul>
+</li>
+<li>
+Language specific files must be included in applications:
+<ul>
+<li>
+Python: Add <code>"import h5py / import numpy"</code>
+</li>
+<li>
+C: Add <code>"#include hdf5.h"</code>
+</li>
+<li>
+FORTRAN: Add <code>"USE HDF5"</code> and call h5open_f and h5close_f to initialize and close the HDF5 FORTRAN interface
+</li>
+<li>
+Java: Add <code>"import hdf.hdf5lib.H5;
+ import hdf.hdf5lib.HDF5Constants;"</code>
+</li>
+</ul>
+</li>
+</ul>
+
+\subsection subsec_intro_pm_file Steps to create a file
+To create an HDF5 file you must:
+\li Specify property lists (or use the defaults).
+\li Create the file.
+\li Close the file (and property lists if needed).
+
+Example:
+<table>
+<caption>The following Python and C examples create a file, file.h5, and then close it.
+The resulting HDF5 file will only contain a root group:</caption>
+<tr>
+<td>
+\image html crtf-pic.png
+</td>
+</tr>
+</table>
+
+Calling h5py.File with ‘w’ for the file access flag will create a new HDF5 file and overwrite
+an existing file with the same name. “file” is the file handle returned from opening the file.
+When finished with the file, it must be closed. When not specifying property lists, the default
+property lists are used:
+
+<table>
+<tr>
+<td>
+<em>Python</em>
+\code
+ import h5py
+ file = h5py.File (‘file.h5’, ‘w’)
+ file.close ()
+\endcode
+</td>
+</tr>
+</table>
+
+The H5Fcreate function creates an HDF5 file. #H5F_ACC_TRUNC is the file access flag to create a new
+file and overwrite an existing file with the same name, and #H5P_DEFAULT is the value specified to
+use a default property list.
+
+<table>
+<tr>
+<td>
+<em>C</em>
+\code
+ #include “hdf5.h”
+
+ int main() {
+ hid_t file_id;
+ herr_t status;
+
+ file_id = H5Fcreate ("file.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ status = H5Fclose (file_id);
+ }
+\endcode
+</td>
+</tr>
+</table>
+
+\subsection subsec_intro_pm_dataset Steps to create a dataset
+As described previously, an HDF5 dataset consists of the raw data, as well as the metadata that
+describes the data (datatype, spatial information, and properties). To create a dataset you must:
+\li Define the dataset characteristics (datatype, dataspace, properties).
+\li Decide which group to attach the dataset to.
+\li Create the dataset.
+\li Close the dataset handle from step 3.
+
+Example:
+<table>
+<caption>The code excerpts below show the calls that need to be made to create a 4 x 6 integer dataset dset
+in a file dset.h5. The dataset will be located in the root group:</caption>
+<tr>
+<td>
+\image html crtdset.png
+</td>
+</tr>
+</table>
+
+With Python, the creation of the dataspace is included as a parameter in the dataset creation method.
+Just one call will create a 4 x 6 integer dataset dset. A pre-defined Big Endian 32-bit integer datatype
+is specified. The create_dataset method creates the dataset in the root group (the file object).
+The dataset is close by the Python interface.
+
+<table>
+<tr>
+<td>
+<em>Python</em>
+\code
+ dataset = file.create_dataset("dset",(4, 6), h5py.h5t.STD_I32BE)
+\endcode
+</td>
+</tr>
+</table>
+
+To create the same dataset in C, you must specify the dataspace with the #H5Screate_simple function,
+create the dataset by calling #H5Dcreate, and then close the dataspace and dataset with calls to #H5Dclose
+and #H5Sclose. #H5P_DEFAULT is specified to use a default property list. Note that the file identifier
+(file_id) is passed in as the first parameter to #H5Dcreate, which creates the dataset in the root group.
+
+<table>
+<tr>
+<td>
+<em>C</em>
+\code
+ // Create the dataspace for the dataset.
+ dims[0] = 4;
+ dims[1] = 6;
+
+ dataspace_id = H5Screate_simple(2, dims, NULL);
+
+ // Create the dataset.
+ dataset_id = H5Dcreate (file_id, "/dset", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ // Close the dataset and dataspace
+ status = H5Dclose(dataset_id);
+ status = H5Sclose(dataspace_id);
+\endcode
+</td>
+</tr>
+</table>
+
+\subsection subsec_intro_pm_write Writing to or reading from a dataset
+Once you have created or opened a dataset you can write to it:
+
+<table>
+<tr>
+<td>
+<em>Python</em>
+\code
+ data = np.zeros((4,6))
+ for i in range(4):
+ for j in range(6):
+ data[i][j]= i*6+j+1
+
+ dataset[...] = data <-- Write data to dataset
+ data_read = dataset[...] <-- Read data from dataset
+\endcode
+</td>
+</tr>
+</table>
+
+#H5S_ALL is passed in for the memory and file dataspace parameters to indicate that the entire dataspace
+of the dataset is specified. These two parameters can be modified to allow subsetting of a dataset.
+The native predefined datatype, #H5T_NATIVE_INT, is used for reading and writing so that HDF5 will do
+any necessary integer conversions:
+
+<table>
+<tr>
+<td>
+<em>C</em>
+\code
+ status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+ status = H5Dread (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+\endcode
+</td>
+</tr>
+</table>
+
+\subsection subsec_intro_pm_group Steps to create a group
+An HDF5 group is a structure containing zero or more HDF5 objects. Before you can create a group you must
+obtain the location identifier of where the group is to be created. Following are the steps that are required:
+\li Decide where to put the group – in the “root group” (or file identifier) or in another group. Open the group if it is not already open.
+\li Define properties or use the default.
+\li Create the group.
+\li Close the group.
+
+<table>
+<caption>Creates attributes that are attached to the dataset dset</caption>
+<tr>
+<td>
+\image html crtgrp.png
+</td>
+</tr>
+</table>
+
+The code below opens the dataset dset.h5 with read/write permission and creates a group MyGroup in the root group.
+Properties are not specified so the defaults are used:
+
+<table>
+<tr>
+<td>
+<em>Python</em>
+\code
+ import h5py
+ file = h5py.File('dset.h5', 'r+')
+ group = file.create_group ('MyGroup')
+ file.close()
+\endcode
+</td>
+</tr>
+</table>
+
+To create the group MyGroup in the root group, you must call #H5Gcreate, passing in the file identifier returned
+from opening or creating the file. The default property lists are specified with #H5P_DEFAULT. The group is then
+closed:
+
+<table>
+<tr>
+<td>
+<em>C</em>
+\code
+ group_id = H5Gcreate (file_id, "MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ status = H5Gclose (group_id);
+\endcode
+</td>
+</tr>
+</table>
+
+\subsection subsec_intro_pm_attr Steps to create and write to an attribute
+To create an attribute you must open the object that you wish to attach the attribute to. Then you can create,
+access, and close the attribute as needed:
+\li Open the object that you wish to add an attribute to.
+\li Create the attribute
+\li Write to the attribute
+\li Close the attribute and the object it is attached to.
+
+<table>
+<caption>Creates attributes that are attached to the dataset dset</caption>
+<tr>
+<td>
+\image html crtatt.png
+</td>
+</tr>
+</table>
+
+The dataspace, datatype, and data are specified in the call to create an attribute in Python:
+
+<table>
+<tr>
+<td>
+<em>Python</em>
+\code
+ dataset.attrs["Units"] = “Meters per second” <-- Create string
+ attr_data = np.zeros((2,))
+ attr_data[0] = 100
+ attr_data[1] = 200
+ dataset.attrs.create("Speed", attr_data, (2,), “i”) <-- Create Integer
+\endcode
+</td>
+</tr>
+</table>
+
+To create an integer attribute in C, you must create the dataspace, create the attribute, write
+to it and then close it in separate steps:
+
+<table>
+<tr>
+<td>
+<em>C</em>
+\code
+ hid_t attribute_id, dataspace_id; // identifiers
+ hsize_t dims;
+ int attr_data[2];
+ herr_t status;
+
+ ...
+
+ // Initialize the attribute data.
+ attr_data[0] = 100;
+ attr_data[1] = 200;
+
+ // Create the data space for the attribute.
+ dims = 2;
+ dataspace_id = H5Screate_simple(1, &dims, NULL);
+
+ // Create a dataset attribute.
+ attribute_id = H5Acreate2 (dataset_id, "Units", H5T_STD_I32BE,
+ dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
+
+ // Write the attribute data.
+ status = H5Awrite(attribute_id, H5T_NATIVE_INT, attr_data);
+
+ // Close the attribute.
+ status = H5Aclose(attribute_id);
+
+ // Close the dataspace.
+ status = H5Sclose(dataspace_id);
+\endcode
+</td>
+</tr>
+</table>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted
+
+
+@page HDF5Examples HDF5 Examples
+Example programs of how to use HDF5 are provided below.
+For HDF-EOS specific examples, see the <a href="http://hdfeos.org/zoo/index.php">examples</a>
+of how to access and visualize NASA HDF-EOS files using IDL, MATLAB, and NCL on the
+<a href="http://hdfeos.org/">HDF-EOS Tools and Information Center</a> page.
+
+\section secHDF5Examples Examples
+\li \ref LBExamples
+\li <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a>
+\li <a href="https://portal.hdfgroup.org/display/HDF5/Examples+in+the+Source+Code">Examples in the Source Code</a>
+\li <a href="https://portal.hdfgroup.org/display/HDF5/Other+Examples">Other Examples</a>
+
+\section secHDF5ExamplesCompile How To Compile
+For information on compiling in C, C++ and Fortran, see: \ref LBCompiling
+
+\section secHDF5ExamplesOther Other Examples
+<a href="http://hdfeos.org/zoo/index.php">IDL, MATLAB, and NCL Examples for HDF-EOS</a>
+Examples of how to access and visualize NASA HDF-EOS files using IDL, MATLAB, and NCL.
+
+<a href="https://support.hdfgroup.org/ftp/HDF5/examples/misc-examples/">Miscellaneous Examples</a>
+These (very old) examples resulted from working with users, and are not fully tested. Most of them are in C, with a few in Fortran and Java.
+
+<a href="https://support.hdfgroup.org/ftp/HDF5/examples/special_values_HDF5_example.tar">Using Special Values</a>
+These examples show how to create special values in an HDF5 application.
+
+*/
diff --git a/doxygen/dox/LearnBasics.dox b/doxygen/dox/LearnBasics.dox
new file mode 100644
index 0000000..298672d
--- /dev/null
+++ b/doxygen/dox/LearnBasics.dox
@@ -0,0 +1,183 @@
+/** @page LearnBasics Learning the Basics
+
+Navigate back: \ref index "Main" / \ref GettingStarted
+<hr>
+
+\section secIntro Introduction
+The following topics cover the basic features in HDF5. The topics build on each other and are
+intended to be completed in order. Some sections use files created in earlier sections. The
+examples used can also be found on the \ref LBExamples
+page and in the HDF5 source code (C, C++, Fortran).
+
+\section Topics Topics
+\li @subpage LBFileOrg
+\li @subpage LBAPI
+\li @subpage LBProg
+\li @subpage LBFileCreate
+\li @subpage LBDsetCreate
+\li @subpage LBDsetRW
+\li @subpage LBAttrCreate
+\li @subpage LBGrpCreate
+\li @subpage LBGrpCreateNames
+\li @subpage LBGrpDset
+\li @subpage LBDsetSubRW
+\li @subpage LBDatatypes
+\li @subpage LBPropsList
+\li @subpage LBDsetLayout
+\li @subpage LBExtDset
+\li @subpage LBComDset
+\li @subpage LBContents
+\li @subpage LBQuiz
+\li @subpage LBQuizAnswers
+\li @subpage LBCompiling
+\li @subpage LBTraining
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted
+
+
+@page LBExamples Examples from Learning the Basics
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBExamples
+These examples are used in the \ref LearnBasics topic. See \ref LBCompiling for details on compiling them.
+PLEASE NOTE that the example programs are listed in the order they are expected to be run. Some example
+programs use files created in earlier examples.
+
+\section secLBExamplesSrc HDF5 Source Code Examples
+These examples (C, C++, Fortran) are provided in the HDF5 source code and (Unix) binaries.
+<table>
+<tr>
+<th>Feature
+</th>
+<th>Examples
+</th>
+<th>Comments
+</th>
+<tr>
+<td>Create a file
+</td>
+<td>C Fortran C++ <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_CreateFile.java">Java</a> Python
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>Create a dataset
+</td>
+<td><a href="https://raw.githubusercontent.com//HDFGroup/hdf5/hdf5_1_10/examples/h5_crtdat.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_crtdat.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_crtdat.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_CreateDataset.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtdat.py">Python</a>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>Read and write to a dataset
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_rdwt.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_rdwt.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_rdwt.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_ReadWrite.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_rdwt.py">Python</a>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>Create an attribute
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_crtatt.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_crtatt.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_crtatt.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_CreateAttribute.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtatt.py">Python</a>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>Create a group
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_crtgrp.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_crtgrp.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_crtgrp.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_CreateGroup.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtgrp.py">Python</a>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>Create groups in a file using absolute and relative paths
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_crtgrpar.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_crtgrpar.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_crtgrpar.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_CreateGroupAbsoluteRelative.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtgrpar.py">Python</a>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>Create datasets in a group
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_crtgrpd.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_crtgrpd.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_crtgrpd.cpp">C++</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/java/examples/intro/H5_CreateGroupDataset.java">Java</a> <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_crtgrpd.py">Python</a>
+</td>
+<td>
+</td>
+</tr>
+<tr>
+<td>Create a file and dataset and select/read a subset from the dataset
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_subset.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_subset.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_subset.cpp">C++</a> Java Python
+</td>
+<td>Also see examples to Write by row (and column) below.
+</td>
+</tr>
+<tr>
+<td>Create an extendible (unlimited dimension) dataset
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_extend.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_extend.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_extend.cpp">C++</a> Java Python
+</td>
+<td>Also see examples to Extend by row (and column) below
+</td>
+</tr>
+<tr>
+<td>Create a chunked and compressed dataset
+</td>
+<td><a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/examples/h5_cmprss.c">C</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/fortran/examples/h5_cmprss.f90">Fortran</a> <a href="https://raw.githubusercontent.com/HDFGroup/hdf5/hdf5_1_10/c++/examples/h5tutr_cmprss.cpp">C++</a> Java <a href="https://support.hdfgroup.org/ftp/HDF5/examples/Py/h5_cmprss.py">Python</a>
+</td>
+<td>
+</td>
+</tr>
+</table>
+
+*See <a href="https://github.com/scotmartin1234/HDF5Mathematica">HDF5Mathematica</a> for user-contributed
+HDF5 Mathematica Wrappers and Introductory Tutorial Examples. The examples use P/Invoke.
+
+\section secLBExamplesAddl Additional Examples
+These examples make minor changes to the tutorial examples.
+<table>
+<tr>
+<th>Feature
+</th>
+<th>Examples
+</th>
+</tr>
+<tr>
+<td>Write by row
+</td>
+<td><a href="">C</a> <a href="">Fortran</a>
+</td>
+</tr>
+<tr>
+<td>Write by column
+</td>
+<td><a href="">C</a> <a href="">Fortran</a>
+</td>
+</tr>
+<tr>
+<td>Extend by row
+</td>
+<td><a href="">C</a> <a href="">Fortran</a>
+</td>
+</tr>
+<tr>
+<td>Extend by column
+</td>
+<td><a href="">C</a> <a href="">Fortran</a>
+</td>
+</tr>
+</table>
+
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+*/
diff --git a/doxygen/dox/LearnBasics1.dox b/doxygen/dox/LearnBasics1.dox
new file mode 100644
index 0000000..a9b6d0e
--- /dev/null
+++ b/doxygen/dox/LearnBasics1.dox
@@ -0,0 +1,1023 @@
+/** @page LBFileOrg HDF5 File Organization
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBFileOrg HDF5 file
+An HDF5 file is a container for storing a variety of scientific data and is composed of two primary types of objects: groups and datasets.
+
+\li HDF5 group: a grouping structure containing zero or more HDF5 objects, together with supporting metadata
+\li HDF5 dataset: a multidimensional array of data elements, together with supporting metadata
+
+Any HDF5 group or dataset may have an associated attribute list. An HDF5 attribute is a user-defined HDF5 structure
+that provides extra information about an HDF5 object.
+
+Working with groups and datasets is similar in many ways to working with directories and files in UNIX. As with UNIX
+directories and files, an HDF5 object in an HDF5 file is often referred to by its full path name (also called an absolute path name).
+
+\li <code style="background-color:whitesmoke;">/</code> signifies the root group.
+
+\li <code style="background-color:whitesmoke;">/foo</code> signifies a member of the root group called foo.
+
+\li <code style="background-color:whitesmoke;">/foo/zoo</code> signifies a member of the group foo, which in turn is a member of the root group.
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBAPI The HDF5 API
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBAPI HDF5 C API
+The HDF5 library provides several interfaces, or APIs. These APIs provide routines for creating,
+accessing, and manipulating HDF5 files and objects.
+
+The library itself is implemented in C. To facilitate the work of FORTRAN 90, C++ and Java programmers,
+HDF5 function wrappers have been developed in each of these languages. This tutorial discusses the use
+of the C functions and the FORTRAN wrappers.
+
+All C routines in the HDF5 library begin with a prefix of the form H5*, where * is one or two uppercase
+letters indicating the type of object on which the function operates.
+The FORTRAN wrappers come in the form of subroutines that begin with h5 and end with _f.
+Java routine names begin with “H5*” and are prefixed with “H5.” as the class. Constants are
+in the HDF5Constants class and are prefixed with "HDF5Constants.".
+The APIs are listed below:
+<table>
+<tr>
+<th><strong>API</strong>
+</th>
+<th><strong>DESCRIPTION</strong>
+</th>
+</tr>
+<tr>
+<th><strong>H5</strong>
+</th>
+<td>Library Functions: general-purpose H5 functions
+</td>
+</tr>
+<tr>
+<th><strong>H5A</strong>
+</th>
+<td>Annotation Interface: attribute access and manipulation routines
+</td>
+</tr>
+<tr>
+<th><strong>H5D</strong>
+</th>
+<td>Dataset Interface: dataset access and manipulation routines
+</td>
+</tr>
+<tr>
+<th><strong>H5E</strong>
+</th>
+<td>Error Interface: error handling routines
+</td>
+</tr>
+<tr>
+<th><strong>H5F</strong>
+</th>
+<td>File Interface: file access routines
+</td>
+</tr>
+<tr>
+<th><strong>H5G</strong>
+</th>
+<td>Group Interface: group creation and operation routines
+</td>
+</tr>
+<tr>
+<th><strong>H5I</strong>
+</th>
+<td>Identifier Interface: identifier routines
+</td>
+</tr>
+<tr>
+<th><strong>H5L</strong>
+</th>
+<td>Link Interface: link routines
+</td>
+</tr>
+<tr>
+<th><strong>H5O</strong>
+</th>
+<td>Object Interface: object routines
+</td>
+</tr>
+<tr>
+<th><strong>H5P</strong>
+</th>
+<td>Property List Interface: object property list manipulation routines
+</td>
+</tr>
+<tr>
+<th><strong>H5R</strong>
+</th>
+<td>Reference Interface: reference routines
+</td>
+</tr>
+<tr>
+<th><strong>H5S</strong>
+</th>
+<td>Dataspace Interface: dataspace definition and access routines
+</td>
+</tr>
+<tr>
+<th><strong>H5T</strong>
+</th>
+<td>Datatype Interface: datatype creation and manipulation routines
+</td>
+</tr>
+<tr>
+<th><strong>H5Z</strong>
+</th>
+<td>Compression Interface: compression routine(s)
+</td>
+</tr>
+</table>
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBProg Programming Issues
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+Keep the following in mind when looking at the example programs included in this tutorial:
+
+\section LBProgAPI APIs vary with different languages
+\li C routines begin with the prefix “H5*” where * is a single letter indicating the object on which the operation is to be performed:
+<table>
+<tr>
+<td>File Interface: </td>
+<td>#H5Fopen</td>
+</tr><tr>
+<td>Dataset Interface:</td>
+<td>#H5Dopen</td>
+</tr>
+</table>
+
+\li FORTRAN routines begin with “h5*” and end with “_f”:
+<table>
+<tr>
+<td>File Interface: </td>
+<td>h5fopen_f</td>
+</tr><tr>
+<td>Dataset Interface:</td>
+<td>h5dopen_f</td>
+</tr>
+</table>
+
+\li Java routine names begin with “H5*” and are prefixed with “H5.” as the class. Constants are
+in the HDF5Constants class and are prefixed with "HDF5Constants.".:
+<table>
+<tr>
+<td>File Interface: </td>
+<td>H5.H5Fopen</td>
+</tr><tr>
+<td>Dataset Interface:</td>
+<td>H5.H5Dopen</td>
+</tr>
+</table>
+
+\li APIS for languages like C++, Java, and Python use methods associated with specific objects.
+
+\section LBProgTypes HDF5 library has its own defined types
+\li #hid_t is used for object handles
+\li hsize_t is used for dimensions
+\li #herr_t is used for many return values
+
+\section LBProgLang Language specific files must be included in applications
+<ul>
+<li>
+Python: Add <code>"import h5py / import numpy"</code>
+</li>
+<li>
+C: Add <code>"#include hdf5.h"</code>
+</li>
+<li>
+FORTRAN: Add <code>"USE HDF5"</code> and call h5open_f and h5close_f to initialize and close the HDF5 FORTRAN interface
+</li>
+<li>
+Java: Add <code>"import hdf.hdf5lib.H5;
+ import hdf.hdf5lib.HDF5Constants;"</code>
+</li>
+</ul>
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBFileCreate Creating an HDF5 File
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+An HDF5 file is a binary file containing scientific data and supporting metadata.
+\section secLBFileCreate HDF5 File Access
+To create an HDF5 file, an application must specify not only a file name, but a file access mode,
+a file creation property list, and a file access property list. These terms are described below:
+<ul>
+<li><strong>File access mode:</strong><br />
+When creating a file, the file access mode specifies the action to take if the file already exists:
+<ul>
+<li>#H5F_ACC_TRUNC specifies that if the file already exists, the current contents will be deleted so
+that the application can rewrite the file with new data.
+</li>
+<li>#H5F_ACC_EXCL specifies that the open will fail if the file already exists. If the file does not
+already exist, the file access parameter is ignored.
+</li>
+</ul>
+In either case, the application has both read and write access to the successfully created file.
+<br />
+Note that there are two different access modes for opening existing files:
+<ul>
+<li>#H5F_ACC_RDONLY specifies that the application has read access but will not be allowed to write any data.
+</li>
+<li>#H5F_ACC_RDWR specifies that the application has read and write access.
+</li>
+</ul>
+</li>
+<li><strong>File creation property list:</strong><br />The file creation property list is used to
+control the file metadata. File metadata contains information about the size of the user-block*,
+the size of various file data structures used by the HDF5 library, etc. In this tutorial, the
+default file creation property list, #H5P_DEFAULT, is used.<br />
+ *The user-block is a fixed-length block of data located at the beginning of the file which is
+ignored by the HDF5 library. The user-block may be used to store any data or information found
+to be useful to applications.
+</li>
+<li><strong>File access property list:</strong><br />The file access property list is used to
+control different methods of performing I/O on files. It also can be used to control how a file
+is closed (whether or not to delay the actual file close until all objects in a file are closed).
+The default file access property list, #H5P_DEFAULT, is used in this tutorial.
+</li>
+</ul>
+
+Please refer to the \ref sec_file section of the \ref UG and \ref H5F section in the \ref RM for
+detailed information regarding file access/creation property lists and access modes.
+
+The steps to create and close an HDF5 file are as follows:
+<ol>
+<li>Specify the file creation and access property lists, if necessary.</li>
+<li>Create the file.</li>
+<li>Close the file, and if necessary, close the property lists.</li>
+</ol>
+
+\section secLBFileExample Programming Example
+
+\subsection subsecLBFileExampleDesc Description
+The following example code demonstrates how to create and close an HDF5 file.
+
+<em>C</em>
+\code
+#include "hdf5.h"
+ #define FILE "file.h5"
+
+ int main() {
+
+ hid_t file_id; /* file identifier */
+ herr_t status;
+
+ /* Create a new file using default properties. */
+ file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /* Terminate access to the file. */
+ status = H5Fclose(file_id);
+ }
+\endcode
+
+<em>Fortran</em>
+\code
+ PROGRAM FILEEXAMPLE
+
+ USE HDF5 ! This module contains all necessary modules
+
+ IMPLICIT NONE
+
+ CHARACTER(LEN=8), PARAMETER :: filename = "filef.h5" ! File name
+ INTEGER(HID_T) :: file_id ! File identifier
+
+ INTEGER :: error ! Error flag
+
+!
+! Initialize FORTRAN interface.
+!
+ CALL h5open_f (error)
+ !
+ ! Create a new file using default properties.
+ !
+ CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
+
+ !
+ ! Terminate access to the file.
+ !
+ CALL h5fclose_f(file_id, error)
+!
+! Close FORTRAN interface.
+!
+ CALL h5close_f(error)
+ END PROGRAM FILEEXAMPLE
+\endcode
+
+See \ref LBExamples for the examples used in the Learning the Basics tutorial.
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection subsecLBFileExampleRem Remarks
+\li <strong>In C</strong>: The include file <code style="background-color:whitesmoke;">hdf5.h</code> contains definitions and declarations and must be included
+in any program that uses the HDF5 library.
+<br />
+<strong>In FORTRAN</strong>: The module <code style="background-color:whitesmoke;">HDF5</code> contains definitions and declarations and must be used in any
+program that uses the HDF5 library. Also note that #H5open MUST be called at the beginning of an HDF5 Fortran
+application (prior to any HDF5 calls) to initialize the library and variables. The #H5close call MUST be at
+the end of the HDF5 Fortran application.
+\li #H5Fcreate creates an HDF5 file and returns the file identifier.<br />
+For Fortran, the file creation property list and file access property list are optional. They can be omitted if the
+default values are to be used.<br />
+The root group is automatically created when a file is created. Every file has a root group and the path name of
+the root group is always <code style="background-color:whitesmoke;">/</code>.
+\li #H5Fclose terminates access to an HDF5 file.<br />
+When an HDF5 file is no longer accessed by a program, #H5Fclose must be called to release the resources used by the file.
+This call is mandatory.<br />
+Note that if #H5Fclose is called for a file, but one or more objects within the file remain open, those objects will
+remain accessible until they are individually closed. This can cause access problems for other users, if objects were
+inadvertently left open. A File Access property controls how the file is closed.
+
+\subsection subsecLBFileExampleCont File Contents
+The HDF Group has developed tools for examining the contents of HDF5 files. The tool used throughout the HDF5 tutorial
+is the HDF5 dumper, <code style="background-color:whitesmoke;">h5dump</code>, which displays the file contents in human-readable form. The output of <code style="background-color:whitesmoke;">h5dump</code> is an ASCII
+display formatted according to the HDF5 DDL grammar. This grammar is defined, using Backus-Naur Form, in the
+\ref DDLBNF110.
+
+To view the HDF5 file contents, simply type:
+\code
+h5dump <filename>
+\endcode
+
+<table>
+<caption>Describe the file contents of file.h5 using a directed graph.</caption>
+<tr>
+<td>
+\image html imgLBFile.gif
+</td>
+</tr>
+</table>
+
+The text description of <code style="background-color:whitesmoke;">file.h5</code>, as generated by <code style="background-color:whitesmoke;">h5dump</code>. The HDF5 file called <code style="background-color:whitesmoke;">file.h5</code>
+contains a group called <code style="background-color:whitesmoke;">/</code>, or the root group. (The file called <code style="background-color:whitesmoke;">filef.h5</code>, created by the FORTRAN version of the example,
+has the same output except that the filename shown is <code style="background-color:whitesmoke;">filef.h5</code>.)
+\code
+HDF5 "file.h5" {
+ GROUP "/" {
+ }
+ }
+\endcode
+
+\subsection subsecLBFileExampleDDL File Definition in DDL
+The simplified DDL file definition for creating an HDF5 file. For simplicity, a simplified DDL is used in this tutorial. A
+complete and more rigorous DDL can be found in the \ref DDLBNF110.
+
+The following symbol definitions are used in the DDL:
+\code
+ ::= defined as
+ <tname> a token with the name tname
+ <a> | <b> one of <a> or <b>
+ <a>* zero or more occurrences of <a>
+\endcode
+
+The simplified DDL for file definition is as follows:
+\code
+ <file> ::= HDF5 "<file_name>" { <root_group> }
+
+ <root_group> ::= GROUP "/" { <group_attribute>*
+ <group_member>* }
+
+ <group_attribute> ::= <attribute>
+
+ <group_member> ::= <group> | <dataset>
+\endcode
+
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBDsetCreate Creating a Dataset
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+A dataset is a multidimensional array of data elements, together with supporting metadata. To create
+a dataset, the application program must specify the location at which to create the dataset, the
+dataset name, the datatype and dataspace of the data array, and the property lists.
+
+\section secLBDsetCreateDtype Datatypes
+A datatype is a collection of properties, all of which can be stored on disk, and which, when taken as
+a whole, provide complete information for data conversion to or from that datatype.
+
+There are two categories of datatypes in HDF5:
+<ul>
+<li><strong>Pre-defined</strong>: These datatypes are opened and closed by HDF5.<br />
+Pre-defined datatypes can be atomic or composite:
+<ul><li>Atomic datatypes cannot be decomposed into smaller datatype units at the API level. For example: integer, float, reference, string.</li>
+<li>Composite datatypes are aggregations of one or more datatypes. For example: array, variable length, enumeration, compound.</li></ul>
+</li>
+<li><strong>Derived</strong>: These datatypes are created or derived from the pre-defined types.<br />
+A simple example of creating a derived datatype is using the string datatype, H5T_C_S1, to create strings of more than one character:<br />
+\code
+ hid_t strtype; // Datatype ID
+ herr_t status;
+
+ strtype = H5Tcopy (H5T_C_S1);
+ status = H5Tset_size (strtype, 5); // create string of length 5
+\endcode
+</li>
+</ul>
+
+Shown below is the HDF5 pre-defined datatypes.
+\code
+ +-- integer
+ +-- floating point
+ +---- atomic ----+-- date and time
+ | +-- character string
+ HDF5 datatypes --| +-- bitfield
+ | +-- opaque
+ |
+ +---- compound
+\endcode
+
+Some of the HDF5 predefined atomic datatypes are listed below.
+
+<table>
+<caption>Examples of HDF5 predefined datatypes</caption>
+<tr>
+<th><strong>Datatype</strong></th>
+<th><strong>Description</strong></th>
+</tr>
+<tr>
+<th><strong>H5T_STD_I32LE</strong></th>
+<td>Four-byte, little-endian, signed, two's complement integer</td>
+</tr>
+<tr>
+<th><strong>H5T_STD_U16BE</strong></th>
+<td>Two-byte, big-endian, unsigned integer</td>
+</tr>
+<tr>
+<th><strong>H5T_IEEE_F32BE</strong></th>
+<td>Four-byte, big-endian, IEEE floating point</td>
+</tr>
+<tr>
+<th><strong>H5T_IEEE_F64LE</strong></th>
+<td>Eight-byte, little-endian, IEEE floating point</td>
+</tr>
+<tr>
+<th><strong>H5T_C_S1</strong></th>
+<td>One-byte, null-terminated string of eight-bit characters</td>
+</tr>
+</table>
+
+<table>
+<caption>Examples of HDF5 predefined native datatypes</caption>
+<tr>
+<th><strong>Native Datatype</strong></th>
+<th><strong>Corresponding C or FORTRAN Type</strong></th>
+</tr>
+<tr>
+<th span="2"><strong>C</strong></th>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_INT</strong></th>
+<td>int</td>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_FLOAT</strong></th>
+<td>float</td>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_CHAR</strong></th>
+<td>char</td>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_DOUBLE</strong></th>
+<td>double</td>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_LDOUBLE</strong></th>
+<td>long double</td>
+</tr>
+<tr>
+<th span="2"><strong>Fortran</strong></th>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_INTEGER</strong></th>
+<td>integer</td>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_REAL</strong></th>
+<td>real</td>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_DOUBLE</strong></th>
+<td>double precision</td>
+</tr>
+<tr>
+<th><strong>H5T_NATIVE_CHARACTER</strong></th>
+<td>character</td>
+</tr>
+</table>
+
+In this tutorial, we consider only HDF5 predefined integers.
+
+For further information on datatypes, see \ref sec_datatype in the \ref UG, in addition to the \ref LBDatatypes tutorial topic.
+
+\section secLBDsetCreateDspace Datasets and Dataspaces
+A dataspace describes the dimensionality of the data array. A dataspace is either a regular N-dimensional
+array of data points, called a simple dataspace, or a more general collection of data points organized
+in another manner, called a complex dataspace. In this tutorial, we only consider simple dataspaces.
+
+<em>HDF5 dataspaces</em>
+\code
+ +-- simple
+ HDF5 dataspaces --|
+ +-- complex
+\endcode
+The dimensions of a dataset can be fixed (unchanging), or they may be unlimited, which means that they are
+extensible. A dataspace can also describe a portion of a dataset, making it possible to do partial
+I/O operations on selections.
+
+\section secLBDsetCreateProp Property Lists
+Property lists are a mechanism for modifying the default behavior when creating or accessing objects. For
+more information on property lists see the \ref LBPropsList tutorial topic.
+
+The following property lists can be specified when creating a dataset:
+\li Dataset Creation Property List<br />
+When creating a dataset, HDF5 allows the user to specify how raw data is organized and/or compressed on
+disk. This information is stored in a dataset creation property list and passed to the dataset interface.
+The raw data on disk can be stored contiguously (in the same linear way that it is organized in memory),
+partitioned into chunks, stored externally, etc. In this tutorial, we use the default dataset creation
+property list (contiguous storage layout and no compression). For more information about dataset creation
+property lists, see \ref sec_dataset in the \ref UG.
+\li Link Creation Property List<br />
+The link creation property list governs creation of the link(s) by which a new dataset is accessed and the
+creation of any intermediate groups that may be missing.
+\li Dataset Access Property List<br />
+Dataset access property lists are properties that can be specified when accessing a dataset.
+
+\section secLBDsetCreateSteps Steps to Create a Dataset
+To create an empty dataset (no data written) the following steps need to be taken:
+<ol>
+<li>Obtain the location identifier where the dataset is to be created.</li>
+<li>Define or specify the dataset characteristics:
+<ol>
+<li>Define a datatype or specify a pre-defined datatype.</li>
+<li>Define a dataspace.</li>
+<li>Specify the property list(s) or use the default.</li>
+</ol></li>
+<li>Create the dataset.</li>
+<li>Close the datatype, the dataspace, and the property list(s) if necessary.</li>
+<li>Close the dataset.</li>
+</ol>
+In HDF5, datatypes and dataspaces are independent objects which are created separately from any dataset
+that they might be attached to. Because of this, the creation of a dataset requires the definition of
+the datatype and dataspace. In this tutorial, we use the HDF5 predefined datatypes (integer) and consider
+only simple dataspaces. Hence, only the creation of dataspace objects is needed.
+
+\section secLBDsetCreateHL High Level APIs
+The High Level \ref H5LT include functions that simplify and condense the steps for
+creating datasets in HDF5. The examples in the following section use the standard APIs. For a
+quick start you may prefer to look at the \ref H5LT at this time.
+
+If you plan to work with images, please look at the High Level \ref H5IM, as well.
+
+\section secLBDsetCreateProg Programming Example
+
+\subsection subsecLBDsetCreateProgDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example shows how to create an empty dataset. It creates a file called <code style="background-color:whitesmoke;">dset.h5</code>
+in the C version (<code style="background-color:whitesmoke;">dsetf.h5</code> in Fortran), defines the dataset dataspace, creates a
+dataset which is a 4x6 integer array, and then closes the dataspace, the dataset, and the file.
+
+For details on compiling an HDF5 application: [ \ref LBCompiling ]
+
+\subsection subsecLBDsetCreateProgRem Remarks
+#H5Screate_simple creates a new simple dataspace and returns a dataspace identifier.
+#H5Sclose releases and terminates access to a dataspace.
+
+<em>C</em>
+\code
+ dataspace_id = H5Screate_simple (rank, dims, maxdims);
+ status = H5Sclose (dataspace_id );
+\endcode
+
+<em>FORTRAN</em>
+\code
+ CALL h5screate_simple_f (rank, dims, dataspace_id, hdferr, maxdims=max_dims)
+ or
+ CALL h5screate_simple_f (rank, dims, dataspace_id, hdferr)
+
+ CALL h5sclose_f (dataspace_id, hdferr)
+\endcode
+
+#H5Dcreate creates an empty dataset at the specified location and returns a dataset identifier.
+#H5Dclose closes the dataset and releases the resource used by the dataset. This call is mandatory.
+
+<em>C</em>
+\code
+ dataset_id = H5Dcreate(file_id, "/dset", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ status = H5Dclose (dataset_id);
+\endcode
+
+<em>FORTRAN</em>
+\code
+ CALL h5dcreate_f (loc_id, name, type_id, dataspace_id, dset_id, hdferr)
+ CALL h5dclose_f (dset_id, hdferr)
+\endcode
+
+Note that if using the pre-defined datatypes in FORTRAN, then a call must be made to initialize and terminate access to the pre-defined datatypes:
+\code
+ CALL h5open_f (hdferr)
+ CALL h5close_f (hdferr)
+\endcode
+
+H5open must be called before any HDF5 library subroutine calls are made;
+H5close must be called after the final HDF5 library subroutine call.
+
+See the programming example for an illustration of the use of these calls.
+
+\subsection subsecLBDsetCreateContent File Contents
+The contents of the file dset.h5 (dsetf.h5 for FORTRAN) are shown below:
+<table>
+<caption>Contents of dset.h5 ( dsetf.h5)</caption>
+<tr>
+<td>
+\image html imgLBDsetCreate.gif
+</td>
+</tr>
+</table>
+<table>
+<tr>
+<th>dset.h5 in DDL</th>
+<th>dsetf.h5 in DDL</th>
+<tr>
+<td>
+\code
+HDF5 "dset.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0
+ }
+ }
+}
+}
+\endcode
+</td>
+<td>
+\code
+HDF5 "dsetf.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 6, 4 ) / ( 6, 4 ) }
+ DATA {
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0
+ }
+ }
+}
+}
+\endcode
+</td>
+</tr>
+</table>
+Note in above that #H5T_STD_I32BE, a 32-bit Big Endian integer, is an HDF atomic datatype.
+
+\subsection subsecLBDsetCreateProgDDL Dataset Definition in DDL
+The following is the simplified DDL dataset definition:
+\code
+ <dataset> ::= DATASET "<dataset_name>" { <datatype>
+ <dataspace>
+ <data>
+ <dataset_attribute>* }
+
+ <datatype> ::= DATATYPE { <atomic_type> }
+
+ <dataspace> ::= DATASPACE { SIMPLE <current_dims> / <max_dims> }
+
+ <dataset_attribute> ::= <attribute>
+\endcode
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBDsetRW Reading From and Writing To a Dataset
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBDsetRW Dataset I/O Operation
+During a dataset I/O operation, the library transfers raw data between memory and the file. The data in memory
+can have a datatype different from that of the file and can also be of a different size (i.e., the data in
+memory is a subset of the dataset elements, or vice versa). Therefore, to perform read or write operations,
+the application program must specify:
+\li The dataset
+\li The dataset's datatype in memory
+\li The dataset's dataspace in memory
+\li The dataset's dataspace in the file
+\li The dataset transfer property list<br />
+<ul>
+<li>(The dataset transfer property list controls various aspects of the I/O operations, such as the number
+of processes participating in a collective I/O request or hints to the library to control caching of raw
+data. In this tutorial, we use the default dataset transfer property list.)</li>
+</ul>
+\li The data buffer
+
+The steps to read from or write to a dataset are as follows:
+<ol>
+<li>Obtain the dataset identifier.</li>
+<li>Specify the memory datatype.</li>
+<li>Specify the memory dataspace.</li>
+<li>Specify the file dataspace.</li>
+<li>Specify the transfer properties.</li>
+<li>Perform the desired operation on the dataset.</li>
+<li>Close the dataset.</li>
+<li>Close the dataspace, datatype, and property list if necessary.</li>
+</ol>
+
+To read from or write to a dataset, the #H5Dread and #H5Dwrite routines are used.
+
+<em>C</em>
+\code
+ status = H5Dread (set_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf );
+ status = H5Dwrite (set_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf);
+\endcode
+
+<em>Fortran</em>
+\code
+ CALL h5dread_f(dset_id, mem_type_id, buf, dims, error, &
+ mem_space_id=mspace_id, file_space_id=fspace_id, &
+ xfer_prp=xfer_plist_id)
+ or
+ CALL h5dread_f(dset_id, mem_type_id, buf, dims, error)
+
+
+ CALL h5dwrite_f(dset_id, mem_type_id, buf, dims, error, &
+ mem_space_id=mspace_id, file_space_id=fspace_id, &
+ xfer_prp=xfer_plist_id)
+ or
+ CALL h5dwrite_f(dset_id, mem_type_id, buf, dims, error)
+\endcode
+
+\section secLBDsetRWHL High Level APIs
+The High Level \ref H5LT include functions that simplify and condense the steps for creating and
+reading datasets. Please be sure to review them, in addition to this tutorial.
+
+\section secLBDsetRWEx Programming Example
+
+\subsection secLBDsetRWExDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example shows how to read and write an existing dataset. It opens the file created in the previous example,
+obtains the dataset identifier for the dataset <code style="background-color:whitesmoke;">/dset</code>, writes the dataset to the file, then reads
+the dataset back. It then closes the dataset and file.
+
+Note that #H5S_ALL is passed in for both the memory and file dataspace parameters in the read and write calls.
+This indicates that the entire dataspace of the dataset will be read or written to. #H5S_ALL by itself does not
+necessarily have this meaning. See the \ref RM entry for #H5Dread or #H5Dwrite for more information on using #H5S_ALL.
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection secLBDsetRWExRem Remarks
+#H5Fopen opens an existing file and returns a file identifier.
+
+#H5Dopen opens an existing dataset with the specified name and location.
+
+#H5Dwrite writes raw data from an application buffer to the specified dataset, converting from the datatype and
+dataspace of the dataset in memory to the datatype and dataspace of the dataset in the file. Specifying #H5S_ALL
+for both the memory and file dataspaces indicates that the entire dataspace of the dataset is to be written to.
+#H5S_ALL by itself does not necessarily have this meaning. See the \ref RM entry for #H5Dwrite for more information
+on using #H5S_ALL.
+
+#H5Dread reads raw data from the specified dataset to an application buffer, converting from the file datatype and
+dataspace to the memory datatype and dataspace. Specifying #H5S_ALL for both the memory and file dataspaces
+indicates that the entire dataspace of the dataset is to be read. #H5S_ALL by itself does not necessarily have
+this meaning. See the \ref RM entry for #H5Dread for more information on using #H5S_ALL.
+
+\subsection secLBDsetRWExCont File Contents
+
+Shown below is the contents of dset.h5 (created by the C program).
+
+<em>dset.h5 in DDL</em>
+\code
+ HDF5 "dset.h5" {
+ GROUP "/" {
+ DATASET "dset" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24
+ }
+ }
+ }
+ }
+\endcode
+
+Shown below is the contents of dsetf.h5 (created by the FORTRAN program).
+
+<em>dsetf.h5 in DDL</em>
+\code
+ HDF5 "dsetf.h5" {
+ GROUP "/" {
+ DATASET "dset" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 6, 4 ) / ( 6, 4 ) }
+ DATA {
+ 1, 7, 13, 19,
+ 2, 8, 14, 20,
+ 3, 9, 15, 21,
+ 4, 10, 16, 22,
+ 5, 11, 17, 23,
+ 6, 12, 18, 24
+ }
+ }
+ }
+ }
+\endcode
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBAttrCreate Creating an Attribute
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+Attributes are small datasets that can be used to describe the nature and/or the intended usage of
+the object they are attached to. In this section, we show how to create, read, and write an attribute.
+
+\section secLBAttrCreate Creating an attribute
+Creating an attribute is similar to creating a dataset. To create an attribute, the application must
+specify the object which the attribute is attached to, the datatype and dataspace of the attribute
+data, and the attribute creation property list.
+
+The steps to create an attribute are as follows:
+<ol>
+<li>Obtain the object identifier that the attribute is to be attached to.</li>
+<li>Define the characteristics of the attribute and specify the attribute creation property list.
+<ul>
+<li>Define the datatype.</li>
+<li>Define the dataspace.</li>
+<li>Specify the attribute creation property list.</li>
+</ul></li>
+<li>Create the attribute.</li>
+<li>Close the attribute and datatype, dataspace, and attribute creation property list, if necessary.</li>
+</ol>
+
+To create and close an attribute, the calling program must use #H5Acreate and #H5Aclose. For example:
+
+<em>C</em>
+\code
+ attr_id = H5Acreate (dataset_id, "Units", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT)
+ status = H5Aclose (attr_id);
+\endcode
+
+<em>Fortran</em>
+\code
+ CALL h5acreate_f (dset_id, attr_nam, type_id, space_id, attr_id, &
+ hdferr, creation_prp=creat_plist_id)
+ or
+ CALL h5acreate_f (dset_id, attr_nam, type_id, space_id, attr_id, hdferr)
+
+ CALL h5aclose_f (attr_id, hdferr)
+\endcode
+
+\section secLBAttrCreateRW Reading/Writing an attribute
+Attributes may only be read or written as an entire object; no partial I/O is supported. Therefore,
+to perform I/O operations on an attribute, the application needs only to specify the attribute and
+the attribute's memory datatype.
+
+The steps to read or write an attribute are as follows.
+<ol>
+<li>Obtain the attribute identifier.</li>
+<li>Specify the attribute's memory datatype.</li>
+<li>Perform the desired operation.</li>
+<li>Close the memory datatype if necessary.</li>
+</ol>
+
+To read and/or write an attribute, the calling program must contain the #H5Aread and/or
+#H5Awrite routines. For example:
+
+<em>C</em>
+\code
+ status = H5Aread (attr_id, mem_type_id, buf);
+ status = H5Awrite (attr_id, mem_type_id, buf);
+\endcode
+
+<em>Fortran</em>
+\code
+ CALL h5awrite_f (attr_id, mem_type_id, buf, dims, hdferr)
+ CALL h5aread_f (attr_id, mem_type_id, buf, dims, hdferr)
+\endcode
+
+\section secLBAttrCreateHL High Level APIs
+The High Level \ref H5LT include functions that simplify and condense the steps for creating and
+reading datasets. Please be sure to review them, in addition to this tutorial.
+
+\section secLBAttrCreateRWEx Programming Example
+
+\subsection secLBAttrCreateRWExDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example shows how to create and write a dataset attribute. It opens an existing file <code style="background-color:whitesmoke;">dset.h5</code>
+in C (<code style="background-color:whitesmoke;">dsetf.h5</code> in FORTRAN), obtains the identifier of the dataset <code style="background-color:whitesmoke;">/dset</code>, defines
+the attribute's dataspace, creates the dataset attribute, writes the attribute, and then closes the attribute's
+dataspace, attribute, dataset, and file.
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection secLBAttrCreateRWExRem Remarks
+#H5Acreate creates an attribute which is attached to the object specified by the first parameter, and returns an identifier.
+
+#H5Awrite writes the entire attribute, and returns the status of the write.
+
+When an attribute is no longer accessed by a program, #H5Aclose must be called to release the attribute from use.
+An #H5Aclose/h5aclose_f call is mandatory.
+
+\subsection secLBAttrCreateRWExCont File Contents
+
+Shown below is the contents and the attribute definition of <code style="background-color:whitesmoke;">dset.h5</code> (created by the C program).
+
+<em>dset.h5 in DDL</em>
+\code
+HDF5 "dset.h5" {
+GROUP "/" {
+DATASET "dset" {
+DATATYPE { H5T_STD_I32BE }
+DATASPACE { SIMPLE ( 4, 6 ) / ( 4, 6 ) }
+DATA {
+ 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24
+}
+ATTRIBUTE "attr" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 2 ) / ( 2 ) }
+ DATA {
+ 100, 200
+ }
+}
+}
+}
+}
+\endcode
+
+Shown below is the contents and the attribute definition of <code style="background-color:whitesmoke;">dsetf.h5</code> (created by the FORTRAN program).
+
+<em>dsetf.h5 in DDL</em>
+\code
+HDF5 "dsetf.h5" {
+GROUP "/" {
+DATASET "dset" {
+DATATYPE { H5T_STD_I32BE }
+DATASPACE { SIMPLE ( 6, 4 ) / ( 6, 4 ) }
+DATA {
+ 1, 7, 13, 19,
+ 2, 8, 14, 20,
+ 3, 9, 15, 21,
+ 4, 10, 16, 22,
+ 5, 11, 17, 23,
+ 6, 12, 18, 24
+}
+ATTRIBUTE "attr" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 2 ) / ( 2 ) }
+ DATA {
+ 100, 200
+ }
+}
+}
+}
+}
+\endcode
+
+\subsection secLBAttrCreateRWExDDL Attribute Definition in DDL
+
+<em>HDF5 Attribute Definition</em>
+\code
+<attribute> ::= ATTRIBUTE "<attr_name>" { <datatype>
+ <dataspace>
+ <data> }
+\endcode
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+*/
diff --git a/doxygen/dox/LearnBasics2.dox b/doxygen/dox/LearnBasics2.dox
new file mode 100644
index 0000000..ffcb971
--- /dev/null
+++ b/doxygen/dox/LearnBasics2.dox
@@ -0,0 +1,1159 @@
+/** @page LBGrpCreate Creating an Group
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBGrpCreate Creating an group
+An HDF5 group is a structure containing zero or more HDF5 objects. The two primary HDF5 objects are groups and datasets. To create a group, the calling program must:
+<ol>
+<li>Obtain the location identifier where the group is to be created.</li>
+<li>Create the group.</li>
+<li>Close the group.</li>
+</ol>
+
+To create a group, the calling program must call #H5Gcreate.
+To close the group, #H5Gclose must be called. The close call is mandatory.
+
+For example:
+
+<em>C</em>
+\code
+ group_id = H5Gcreate(file_id, "/MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ status = H5Gclose (group_id);
+\endcode
+
+<em>Fortran</em>
+\code
+ CALL h5gcreate_f (loc_id, name, group_id, error)
+ CALL h5gclose_f (group_id, error)
+\endcode
+
+\section secLBGrpCreateRWEx Programming Example
+
+\subsection secLBGrpCreateRWExDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example shows how to create and close a group. It creates a file called <code style="background-color:whitesmoke;">group.h5</code> in C
+(<code style="background-color:whitesmoke;">groupf.h5</code> for FORTRAN), creates a group called MyGroup in the root group, and then closes the group and file.
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection secLBGrpCreateRWExCont File Contents
+
+Shown below is the contents and the definition of the group of <code style="background-color:whitesmoke;">group.h5</code> (created by the C program).
+(The FORTRAN program creates the HDF5 file <code style="background-color:whitesmoke;">groupf.h5</code> and the resulting DDL shows the filename
+<code style="background-color:whitesmoke;">groupf.h5</code> in the first line.)
+<table>
+<caption>The Contents of group.h5.</caption>
+<tr>
+<td>
+\image html imggrpcreate.gif
+</td>
+</tr>
+</table>
+
+<em>group.h5 in DDL</em>
+\code
+HDF5 "group.h5" {
+GROUP "/" {
+ GROUP "MyGroup" {
+ }
+}
+}
+\endcode
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBGrpCreateNames Creating Groups using Absolute and Relative Names
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+Recall that to create an HDF5 object, we have to specify the location where the object is to be created.
+This location is determined by the identifier of an HDF5 object and the name of the object to be created.
+The name of the created object can be either an absolute name or a name relative to the specified identifier.
+In the previous example, we used the file identifier and the absolute name <code style="background-color:whitesmoke;">/MyGroup</code> to create a group.
+
+In this section, we discuss HDF5 names and show how to use absolute and relative names.
+
+\section secLBGrpCreateNames Names
+HDF5 object names are a slash-separated list of components. There are few restrictions on names: component
+names may be any length except zero and may contain any character except slash (<code style="background-color:whitesmoke;">/</code>) and the null terminator.
+A full name may be composed of any number of component names separated by slashes, with any of the component
+names being the special name <code style="background-color:whitesmoke;">.</code> (a dot or period). A name which begins with a slash is an <em>absolute name</em> which
+is accessed beginning with the root group of the file; all other names are <em>relative names</em> and and the named
+object is accessed beginning with the specified group. A special case is the name <code style="background-color:whitesmoke;">/</code> (or equivalent) which
+refers to the root group.
+
+Functions which operate on names generally take a location identifier, which can be either a file identifier
+or a group identifier, and perform the lookup with respect to that location. Several possibilities are
+described in the following table:
+
+<table>
+<tr>
+<th><strong>Location Type</strong></th>
+<th><strong>Object Name</strong></th>
+<th><strong>Description</strong></th>
+</tr>
+<tr>
+<th><strong>File identifier</strong></th>
+<td>/foo/bar</td>
+<td>The object bar in group foo in the root group.</td>
+</tr>
+<tr>
+<th><strong>Group identifier</strong></th>
+<td>/foo/bar</td>
+<td>The object bar in group foo in the root group of the file containing the specified group.
+In other words, the group identifier's only purpose is to specify a file.</td>
+</tr>
+<tr>
+<th><strong>File identifier</strong></th>
+<td>/</td>
+<td>The root group of the specified file.</td>
+</tr>
+<tr>
+<th><strong>Group identifier</strong></th>
+<td>/</td>
+<td>The root group of the file containing the specified group.</td>
+</tr>
+<tr>
+<th><strong>Group identifier</strong></th>
+<td>foo/bar</td>
+<td>The object bar in group foo in the specified group.</td>
+</tr>
+<tr>
+<th><strong>File identifier</strong></th>
+<td>.</td>
+<td>The root group of the file.</td>
+</tr>
+<tr>
+<th><strong>Group identifier</strong></th>
+<td>.</td>
+<td>The specified group.</td>
+</tr>
+<tr>
+<th><strong>Other identifier</strong></th>
+<td>.</td>
+<td>The specified object.</td>
+</tr>
+</table>
+
+\section secLBGrpCreateNamesEx Programming Example
+
+\subsection secLBGrpCreateNamesExDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example code shows how to create groups using absolute and relative names. It creates three groups: the first two groups are created using
+the file identifier and the group absolute names while the third group is created using a group identifier and a name relative to the specified group.
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection secLBGrpCreateNamesExRem Remarks
+#H5Gcreate creates a group at the location specified by a location identifier and a name. The location identifier
+can be a file identifier or a group identifier and the name can be relative or absolute.
+
+The first #H5Gcreate/h5gcreate_f creates the group <code style="background-color:whitesmoke;">MyGroup</code> in the root group of the specified file.
+
+The second #H5Gcreate/h5gcreate_f creates the group <code style="background-color:whitesmoke;">Group_A</code> in the group <code style="background-color:whitesmoke;">MyGroup</code> in the root group of the specified
+file. Note that the parent group (<code style="background-color:whitesmoke;">MyGroup</code>) already exists.
+
+The third #H5Gcreate/h5gcreate_f creates the group <code style="background-color:whitesmoke;">Group_B</code> in the specified group.
+
+\subsection secLBGrpCreateNamesExCont File Contents
+
+Shown below is the contents and the definition of the group of <code style="background-color:whitesmoke;">groups.h5</code> (created by the C program).
+(The FORTRAN program creates the HDF5 file <code style="background-color:whitesmoke;">groupsf.h5</code> and the resulting DDL shows the filename
+<code style="background-color:whitesmoke;">groupsf.h5</code> in the first line.)
+<table>
+<caption>The Contents of groups.h5.</caption>
+<tr>
+<td>
+\image html imggrps.gif
+</td>
+</tr>
+</table>
+
+<em>groups.h5 in DDL</em>
+\code
+HDF5 "groups.h5" {
+GROUP "/" {
+ GROUP "MyGroup" {
+ GROUP "Group_A" {
+ }
+ GROUP "Group_B" {
+ }
+ }
+}
+}
+\endcode
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBGrpDset Creating Datasets in Groups
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBGrpDset Datasets in Groups
+We have shown how to create groups, datasets, and attributes. In this section, we show how to create
+datasets in groups. Recall that #H5Dcreate creates a dataset at the location specified by a location
+identifier and a name. Similar to #H5Gcreate, the location identifier can be a file identifier or a
+group identifier and the name can be relative or absolute. The location identifier and the name
+together determine the location where the dataset is to be created. If the location identifier and
+name refer to a group, then the dataset is created in that group.
+
+\section secLBGrpDsetEx Programming Example
+
+\subsection secLBGrpDsetExDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example shows how to create a dataset in a particular group. It opens the file created in the previous example and creates two datasets:
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection secLBGrpDsetExCont File Contents
+
+Shown below is the contents and the definition of the group of <code style="background-color:whitesmoke;">groups.h5</code> (created by the C program).
+(The FORTRAN program creates the HDF5 file <code style="background-color:whitesmoke;">groupsf.h5</code> and the resulting DDL shows the filename
+<code style="background-color:whitesmoke;">groupsf.h5</code> in the first line.)
+<table>
+<caption>The contents of the file groups.h5 (groupsf.h5 for FORTRAN)</caption>
+<tr>
+<td>
+\image html imggrpdsets.gif
+</td>
+</tr>
+</table>
+
+<em>groups.h5 in DDL</em>
+\code
+HDF5 "groups.h5" {
+GROUP "/" {
+GROUP "MyGroup" {
+GROUP "Group_A" {
+ DATASET "dset2" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 2, 10 ) / ( 2, 10 ) }
+ DATA {
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
+ }
+ }
+}
+GROUP "Group_B" {
+}
+DATASET "dset1" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 3, 3 ) / ( 3, 3 ) }
+ DATA {
+ 1, 2, 3,
+ 1, 2, 3,
+ 1, 2, 3
+ }
+}
+}
+}
+}
+\endcode
+
+<em>groupsf.h5 in DDL</em>
+\code
+HDF5 "groupsf.h5" {
+GROUP "/" {
+GROUP "MyGroup" {
+GROUP "Group_A" {
+ DATASET "dset2" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 10, 2 ) / ( 10, 2 ) }
+ DATA {
+ 1, 1,
+ 2, 2,
+ 3, 3,
+ 4, 4,
+ 5, 5,
+ 6, 6,
+ 7, 7,
+ 8, 8,
+ 9, 9,
+ 10, 10
+ }
+ }
+}
+GROUP "Group_B" {
+}
+DATASET "dset1" {
+ DATATYPE { H5T_STD_I32BE }
+ DATASPACE { SIMPLE ( 3, 3 ) / ( 3, 3 ) }
+ DATA {
+ 1, 1, 1,
+ 2, 2, 2,
+ 3, 3, 3
+ }
+}
+}
+}
+}
+\endcode
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBDsetSubRW Reading From or Writing To a Subset of a Dataset
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBDsetSubRW Dataset Subsets
+There are two ways that you can select a subset in an HDF5 dataset and read or write to it:
+<ul><li>
+<strong>Hyperslab Selection</strong>: The #H5Sselect_hyperslab call selects a logically contiguous
+collection of points in a dataspace, or a regular pattern of points or blocks in a dataspace.
+</li><li>
+<strong>Element Selection</strong>: The #H5Sselect_elements call selects elements in an array.
+</li></ul>
+
+HDF5 allows you to read from or write to a portion or subset of a dataset by:
+\li Selecting a Subset of the Dataset's Dataspace,
+\li Selecting a Memory Dataspace,
+\li Reading From or Writing to a Dataset Subset.
+
+\section secLBDsetSubRWSel Selecting a Subset of the Dataset's Dataspace
+First you must obtain the dataspace of a dataset in a file by calling #H5Dget_space.
+
+Then select a subset of that dataspace by calling #H5Sselect_hyperslab. The <em>offset</em>, <em>count</em>, <em>stride</em>
+and <em>block</em> parameters of this API define the shape and size of the selection. They must be arrays
+with the same number of dimensions as the rank of the dataset's dataspace. These arrays <strong>ALL</strong> work
+together to define a selection. A change to one of these arrays can affect the others.
+\li \em offset: An array that specifies the offset of the starting element of the specified hyperslab.
+\li \em count: An array that determines how many blocks to select from the dataspace in each dimension. If the block
+size for a dimension is one then the count is the number of elements along that dimension.
+\li \em stride: An array that allows you to sample elements along a dimension. For example, a stride of one (or NULL)
+will select every element along a dimension, a stride of two will select every other element, and a stride of three
+will select an element after every two elements.
+\li \em block: An array that determines the size of the element block selected from a dataspace. If the block size
+is one or NULL then the block size is a single element in that dimension.
+
+\section secLBDsetSubRWMem Selecting a Memory Dataspace
+You must select a memory dataspace in addition to a file dataspace before you can read a subset from or write a subset
+to a dataset. A memory dataspace can be specified by calling #H5Screate_simple.
+
+The memory dataspace passed to the read or write call must contain the same number of elements as the file dataspace.
+The number of elements in a dataspace selection can be determined with the #H5Sget_select_npoints API.
+
+\section secLBDsetSubRWSub Reading From or Writing To a Dataset Subset
+To read from or write to a dataset subset, the #H5Dread and #H5Dwrite routines are used. The memory and file dataspace
+identifiers from the selections that were made are passed into the read or write call. For example (C):
+\code
+ status = H5Dwrite (.., .., memspace_id, dataspace_id, .., ..);
+\endcode
+
+\section secLBDsetSubRWProg Programming Example
+
+\subsection subsecLBDsetSubRWProgDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example creates an 8 x 10 integer dataset in an HDF5 file. It then selects and writes to a 3 x 4 subset
+of the dataset created with the dimensions offset by 1 x 2. (If using Fortran, the dimensions will be swapped.
+The dataset will be 10 x 8, the subset will be 4 x 3, and the offset will be 2 x 1.)
+
+PLEASE NOTE that the examples and images below were created using C.
+
+The following image shows the dataset that gets written originally, and the subset of data that gets modified
+afterwards. Dimension 0 is vertical and Dimension 1 is horizontal as shown below:
+<table>
+<tr>
+<td>
+\image html LBDsetSubRWProg.png
+</td>
+</tr>
+</table>
+
+The subset on the right above is created using these values for offset, count stride, and block:
+\code
+offset = {1, 2}
+
+count = {3, 4}
+
+stride = {1, 1}
+
+block = {1, 1}
+\endcode
+
+\subsection subsecLBDsetSubRWProgExper Experiments with Different Selections
+Following are examples of changes that can be made to the example code provided to better understand
+how to make selections.
+
+\subsubsection subsubsecLBDsetSubRWProgExperOne Example 1
+By default the example code will select and write to a 3 x 4 subset. You can modify the count
+parameter in the example code to select a different subset, by changing the value of
+DIM0_SUB (C, C++) / dim0_sub (Fortran) near the top. Change its value to 7 to create a 7 x 4 subset:
+<table>
+<tr>
+<td>
+\image html imgLBDsetSubRW11.png
+</td>
+</tr>
+</table>
+
+If you were to change the subset to 8 x 4, the selection would be beyond the extent of the dimension:
+<table>
+<tr>
+<td>
+\image html imgLBDsetSubRW12.png
+</td>
+</tr>
+</table>
+
+The write will fail with the error: "<strong>file selection+offset not within extent</strong>"
+
+\subsubsection subsubsecLBDsetSubRWProgExperTwo Example 2
+In the example code provided, the memory and file dataspaces passed to the H5Dwrite call have the
+same size, 3 x 4 (DIM0_SUB x DIM1_SUB). Change the size of the memory dataspace to be 4 x 4 so that
+they do not match, and then compile:
+\code
+ dimsm[0] = DIM0_SUB + 1;
+ dimsm[1] = DIM1_SUB;
+ memspace_id = H5Screate_simple (RANK, dimsm, NULL);
+\endcode
+The code will fail with the error: "<strong>src and dest data spaces have different sizes</strong>"
+
+How many elements are in the memory and file dataspaces that were specified above? Add these lines:
+\code
+ hssize_t size;
+
+ /* Just before H5Dwrite call the following */
+ size = H5Sget_select_npoints (memspace_id);
+ printf ("\nmemspace_id size: %i\n", size);
+ size = H5Sget_select_npoints (dataspace_id);
+ printf ("dataspace_id size: %i\n", size);
+\endcode
+
+You should see these lines followed by the error:
+\code
+ memspace_id size: 16
+ dataspace_id size: 12
+\endcode
+
+\subsubsection subsubsecLBDsetSubRWProgExperThree Example 3
+This example shows the selection that occurs if changing the values of the <em>offset</em>, <em>count</em>,
+<em>stride</em> and <em>block</em> parameters in the example code.
+
+This will select two blocks. The <em>count</em> array specifies the number of blocks. The <em>block</em> array
+specifies the size of a block. The <em>stride</em> must be modified to accommodate the block <em>size</em>.
+<table>
+<tr>
+<td>
+\image html imgLBDsetSubRW31.png
+</td>
+</tr>
+</table>
+
+Now try modifying the count as shown below. The write will fail because the selection goes beyond the extent of the dimension:
+<table>
+<tr>
+<td>
+\image html imgLBDsetSubRW32.png
+</td>
+</tr>
+</table>
+
+If the offset were 1x1 (instead of 1x2), then the selection can be made:
+<table>
+<tr>
+<td>
+\image html imgLBDsetSubRW33.png
+</td>
+</tr>
+</table>
+
+The selections above were tested with the
+<a href="https://support.hdfgroup.org/ftp/HDF5/examples/howto/subset/h5_subsetbk.c">h5_subsetbk.c</a>
+example code. The memory dataspace was defined as one-dimensional.
+
+\subsection subsecLBDsetSubRWProgRem Remarks
+\li In addition to #H5Sselect_hyperslab, this example introduces the #H5Dget_space call to obtain the dataspace of a dataset.
+\li If using the default values for the stride and block parameters of #H5Sselect_hyperslab, then, for C you can specify NULL
+for these parameters, rather than passing in an array for each, and for Fortran 90 you can omit these parameters.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBDatatypes Datatype Basics
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBDtype What is a Datatype?
+A datatype is a collection of datatype properties which provide complete information for data conversion to or from that datatype.
+
+Datatypes in HDF5 can be grouped as follows:
+\li <strong>Pre-Defined Datatypes</strong>: These are datatypes that are created by HDF5. They are actually opened
+(and closed) by HDF5, and can have a different value from one HDF5 session to the next.
+\li <strong>Derived Datatypes</strong>: These are datatypes that are created or derived from the pre-defined datatypes.
+Although created from pre-defined types, they represent a category unto themselves. An example of a commonly used derived
+datatype is a string of more than one character.
+
+\section secLBDtypePre Pre-defined Datatypes
+The properties of pre-defined datatypes are:
+\li Pre-defined datatypes are opened and closed by HDF5.
+\li A pre-defined datatype is a handle and is NOT PERSISTENT. Its value can be different from one HDF5 session to the next.
+\li Pre-defined datatypes are Read-Only.
+\li As mentioned, other datatypes can be derived from pre-defined datatypes.
+
+There are two types of pre-defined datatypes, standard (file) and native.
+
+<h4>Standard</h4>
+A standard (or file) datatype can be:
+<ul>
+<li><strong>Atomic</strong>: A datatype which cannot be decomposed into smaller datatype units at the API level.
+The atomic datatypes are:
+<ul>
+<li>integer</li>
+<li>float</li>
+<li>string (1-character)</li>
+<li>date and time</li>
+<li>bitfield</li>
+<li>reference</li>
+<li>opaque</li>
+</ul>
+</li>
+<li><strong>Composite</strong>: An aggregation of one or more datatypes.
+Composite datatypes include:
+<ul>
+<li>array</li>
+<li>variable length</li>
+<li>enumeration</li>
+<li>compound datatypes</li>
+</ul>
+Array, variable length, and enumeration datatypes are defined in terms of a single atomic datatype,
+whereas a compound datatype is a datatype composed of a sequence of datatypes.
+</li>
+</ul>
+
+<table>
+<tr>
+<th><strong>Notes</strong></th>
+</tr>
+<tr>
+<td>
+\li Standard pre-defined datatypes are the SAME on all platforms.
+\li They are the datatypes that you see in an HDF5 file.
+\li They are typically used when creating a dataset.
+</td>
+</tr>
+</table>
+
+<h4>Native</h4>
+Native pre-defined datatypes are used for memory operations, such as reading and writing. They are
+NOT THE SAME on different platforms. They are similar to C type names, and are aliased to the
+appropriate HDF5 standard pre-defined datatype for a given platform.
+
+For example, when on an Intel based PC, #H5T_NATIVE_INT is aliased to the standard pre-defined type,
+#H5T_STD_I32LE. On a MIPS machine, it is aliased to #H5T_STD_I32BE.
+<table>
+<tr>
+<th><strong>Notes</strong></th>
+</tr>
+<tr>
+<td>
+\li Native datatypes are NOT THE SAME on all platforms.
+\li Native datatypes simplify memory operations (read/write). The HDF5 library automatically converts as needed.
+\li Native datatypes are NOT in an HDF5 File. The standard pre-defined datatype that a native datatype corresponds
+to is what you will see in the file.
+</td>
+</tr>
+</table>
+
+<h4>Pre-Defined</h4>
+The following table shows the native types and the standard pre-defined datatypes they correspond
+to. (Keep in mind that HDF5 can convert between datatypes, so you can specify a buffer of a larger
+type for a dataset of a given type. For example, you can read a dataset that has a short datatype
+into a long integer buffer.)
+
+<table>
+<caption>Some HDF5 pre-defined native datatypes and corresponding standard (file) type</caption>
+<tr>
+<th><strong>C Type</strong></th>
+<th><strong>HDF5 Memory Type</strong></th>
+<th><strong>HDF5 File Type*</strong></th>
+</tr>
+<tr>
+<th span="3"><strong>Integer</strong></th>
+</tr>
+<tr>
+<td>int</td>
+<td>#H5T_NATIVE_INT</td>
+<td>#H5T_STD_I32BE or #H5T_STD_I32LE</td>
+</tr>
+<tr>
+<td>short</td>
+<td>#H5T_NATIVE_SHORT</td>
+<td>#H5T_STD_I16BE or #H5T_STD_I16LE</td>
+</tr>
+<tr>
+<td>long</td>
+<td>#H5T_NATIVE_LONG</td>
+<td>#H5T_STD_I32BE, #H5T_STD_I32LE,
+ #H5T_STD_I64BE or #H5T_STD_I64LE</td>
+</tr>
+<tr>
+<td>long long</td>
+<td>#H5T_NATIVE_LLONG</td>
+<td>#H5T_STD_I64BE or #H5T_STD_I64LE</td>
+</tr>
+<tr>
+<td>unsigned int</td>
+<td>#H5T_NATIVE_UINT</td>
+<td>#H5T_STD_U32BE or #H5T_STD_U32LE</td>
+</tr>
+<tr>
+<td>unsigned short</td>
+<td>#H5T_NATIVE_USHORT</td>
+<td>#H5T_STD_U16BE or #H5T_STD_U16LE</td>
+</tr>
+<tr>
+<td>unsigned long</td>
+<td>#H5T_NATIVE_ULONG</td>
+<td>#H5T_STD_U32BE, #H5T_STD_U32LE,
+ #H5T_STD_U64BE or #H5T_STD_U64LE</td>
+</tr>
+<tr>
+<td>unsigned long long</td>
+<td>#H5T_NATIVE_ULLONG</td>
+<td>#H5T_STD_U64BE or #H5T_STD_U64LE</td>
+</tr>
+<tr>
+<th span="3"><strong>Float</strong></th>
+</tr>
+<tr>
+<td>float</td>
+<td>#H5T_NATIVE_FLOAT</td>
+<td>#H5T_IEEE_F32BE or #H5T_IEEE_F32LE</td>
+</tr>
+<tr>
+<td>double</td>
+<td>#H5T_NATIVE_DOUBLE</td>
+<td>#H5T_IEEE_F64BE or #H5T_IEEE_F64LE</td>
+</tr>
+</table>
+
+<table>
+<caption>Some HDF5 pre-defined native datatypes and corresponding standard (file) type</caption>
+<tr>
+<th><strong>F90 Type</strong></th>
+<th><strong>HDF5 Memory Type</strong></th>
+<th><strong>HDF5 File Type*</strong></th>
+</tr>
+<tr>
+<td>integer</td>
+<td>H5T_NATIVE_INTEGER</td>
+<td>#H5T_STD_I32BE(8,16) or #H5T_STD_I32LE(8,16)</td>
+</tr>
+<tr>
+<td>real</td>
+<td>H5T_NATIVE_REAL</td>
+<td>#H5T_IEEE_F32BE or #H5T_IEEE_F32LE</td>
+</tr>
+<tr>
+<td>double-precision</td>
+<td>#H5T_NATIVE_DOUBLE</td>
+<td>#H5T_IEEE_F64BE or #H5T_IEEE_F64LE</td>
+</tr>
+</table>
+
+<table>
+<tr>
+<td>* Note that the HDF5 File Types listed are those that are most commonly created.
+ The file type created depends on the compiler switches and platforms being
+ used. For example, on the Cray an integer is 64-bit, and using #H5T_NATIVE_INT (C)
+ or H5T_NATIVE_INTEGER (F90) would result in an #H5T_STD_I64BE file type.</td>
+</tr>
+</table>
+
+The following code is an example of when you would use standard pre-defined datatypes vs. native types:
+\code
+ #include "hdf5.h"
+
+ main() {
+
+ hid_t file_id, dataset_id, dataspace_id;
+ herr_t status;
+ hsize_t dims[2]={4,6};
+ int i, j, dset_data[4][6];
+
+ for (i = 0; i < 4; i++)
+ for (j = 0; j < 6; j++)
+ dset_data[i][j] = i * 6 + j + 1;
+
+ file_id = H5Fcreate ("dtypes.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ dataspace_id = H5Screate_simple (2, dims, NULL);
+
+ dataset_id = H5Dcreate (file_id, "/dset", H5T_STD_I32BE, dataspace_id,
+ H5P_DEFAULT);
+
+ status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
+ H5P_DEFAULT, dset_data);
+
+ status = H5Dclose (dataset_id);
+
+ status = H5Fclose (file_id);
+ }
+\endcode
+By using the native types when reading and writing, the code that reads from or writes to a dataset
+can be the same for different platforms.
+
+Can native types also be used when creating a dataset? Yes. However, just be aware that the resulting
+datatype in the file will be one of the standard pre-defined types and may be different than expected.
+
+What happens if you do not use the correct native datatype for a standard (file) datatype? Your data
+may be incorrect or not what you expect.
+
+\section secLBDtypeDer Derived Datatypes
+ANY pre-defined datatype can be used to derive user-defined datatypes.
+
+To create a datatype derived from a pre-defined type:
+<ol>
+<li>Make a copy of the pre-defined datatype:
+\code
+ tid = H5Tcopy (H5T_STD_I32BE);
+\endcode
+</li>
+<li>Change the datatype.</li>
+</ol>
+
+There are numerous datatype functions that allow a user to alter a pre-defined datatype. See
+\ref subsecLBDtypeSpecStr below for a simple example.
+
+Refer to the \ref H5T in the \ref RM. Example functions are #H5Tset_size and #H5Tset_precision.
+
+\section secLBDtypeSpec Specific Datatypes
+On the <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a>
+page under <a href="https://confluence.hdfgroup.org/display/HDF5/Examples+by+API#ExamplesbyAPI-datatypes">Datatypes</a>
+you will find many example programs for creating and reading datasets with different datatypes.
+
+Below is additional information on some of the datatypes. See
+the <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a>
+page for examples of these datatypes.
+
+\subsection subsecLBDtypeSpec Array Datatype vs Array Dataspace
+#H5T_ARRAY is a datatype, and it should not be confused with the dataspace of a dataset. The dataspace
+of a dataset can consist of a regular array of elements. For example, the datatype for a dataset
+could be an atomic datatype like integer, and the dataset could be an N-dimensional appendable array,
+as specified by the dataspace. See #H5Screate and #H5Screate_simple for details.
+
+Unlimited dimensions and subsetting are not supported when using the #H5T_ARRAY datatype.
+
+The #H5T_ARRAY datatype was primarily created to address the simple case of a compound datatype
+when all members of the compound datatype are of the same type and there is no need to subset by
+compound datatype members. Creation of such a datatype is more efficient and I/O also requires
+less work, because there is no alignment involved.
+
+\subsection subsecLBDtypeSpecArr Array Datatype
+The array class of datatypes, #H5T_ARRAY, allows the construction of true, homogeneous,
+multi-dimensional arrays. Since these are homogeneous arrays, each element of the array
+will be of the same datatype, designated at the time the array is created.
+
+Users may be confused by this datatype, as opposed to a dataset with a simple atomic
+datatype (eg. integer) that is an array. See subsecLBDtypeSpec for more information.
+
+Arrays can be nested. Not only is an array datatype used as an element of an HDF5 dataset,
+but the elements of an array datatype may be of any datatype, including another array datatype.
+
+Array datatypes <strong>cannot be subdivided for I/O</strong>; the entire array must be transferred from one
+dataset to another.
+
+Within certain limitations, outlined in the next paragraph, array datatypes may be N-dimensional
+and of any dimension size. <strong>Unlimited dimensions, however, are not supported</strong>. Functionality similar
+to unlimited dimension arrays is available through the use of variable-length datatypes.
+
+The maximum number of dimensions, i.e., the maximum rank, of an array datatype is specified by
+the HDF5 library constant #H5S_MAX_RANK. The minimum rank is 1 (one). All dimension sizes must
+be greater than 0 (zero).
+
+One array datatype may only be converted to another array datatype if the number of dimensions
+and the sizes of the dimensions are equal and the datatype of the first array's elements can be
+converted to the datatype of the second array's elements.
+
+\subsubsection subsubsecLBDtypeSpecArrAPI Array Datatype APIs
+There are three functions that are specific to array datatypes: one, #H5Tarray_create, for creating
+an array datatype, and two, #H5Tget_array_ndims and #H5Tget_array_dims
+for working with existing array datatypes.
+
+<h4>Creating</h4>
+The function #H5Tarray_create creates a new array datatype object. Parameters specify
+\li the base datatype of each element of the array,
+\li the rank of the array, i.e., the number of dimensions,
+\li the size of each dimension, and
+\li the dimension permutation of the array, i.e., whether the elements of the array are listed in C or FORTRAN order.
+
+<h4>Working with existing array datatypes</h4>
+When working with existing arrays, one must first determine the the rank, or number of dimensions, of the array.
+
+The function #H5Tget_array_dims returns the rank of a specified array datatype.
+
+In many instances, one needs further information. The function #H5Tget_array_dims retrieves the
+permutation of the array and the size of each dimension.
+
+\subsection subsecLBDtypeSpecCmpd Compound
+
+\subsubsection subsubsecLBDtypeSpecCmpdProp Properties of compound datatypes
+A compound datatype is similar to a struct in C or a common block in Fortran. It is a collection of
+one or more atomic types or small arrays of such types. To create and use of a compound datatype
+you need to refer to various properties of the data compound datatype:
+\li It is of class compound.
+\li It has a fixed total size, in bytes.
+\li It consists of zero or more members (defined in any order) with unique names and which occupy non-overlapping regions within the datum.
+\li Each member has its own datatype.
+\li Each member is referenced by an index number between zero and N-1, where N is the number of members in the compound datatype.
+\li Each member has a name which is unique among its siblings in a compound datatype.
+\li Each member has a fixed byte offset, which is the first byte (smallest byte address) of that member in a compound datatype.
+\li Each member can be a small array of up to four dimensions.
+
+Properties of members of a compound datatype are defined when the member is added to the compound type and cannot be subsequently modified.
+
+\subsubsection subsubsecLBDtypeSpecCmpdDef Defining compound datatypes
+Compound datatypes must be built out of other datatypes. First, one creates an empty compound
+datatype and specifies its total size. Then members are added to the compound datatype in any order.
+
+Member names. Each member must have a descriptive name, which is the key used to uniquely identify
+the member within the compound datatype. A member name in an HDF5 datatype does not necessarily
+have to be the same as the name of the corresponding member in the C struct in memory, although
+this is often the case. Nor does one need to define all members of the C struct in the HDF5
+compound datatype (or vice versa).
+
+Offsets. Usually a C struct will be defined to hold a data point in memory, and the offsets of the
+members in memory will be the offsets of the struct members from the beginning of an instance of the
+struct. The library defines the macro to compute the offset of a member within a struct:
+\code
+ HOFFSET(s,m)
+\endcode
+This macro computes the offset of member m within a struct variable s.
+
+Here is an example in which a compound datatype is created to describe complex numbers whose type
+is defined by the complex_t struct.
+\code
+typedef struct {
+ double re; /*real part */
+ double im; /*imaginary part */
+} complex_t;
+
+complex_t tmp; /*used only to compute offsets */
+hid_t complex_id = H5Tcreate (H5T_COMPOUND, sizeof tmp);
+H5Tinsert (complex_id, "real", HOFFSET(tmp,re), H5T_NATIVE_DOUBLE);
+H5Tinsert (complex_id, "imaginary", HOFFSET(tmp,im), H5T_NATIVE_DOUBLE);
+\endcode
+
+\subsection subsecLBDtypeSpecRef Reference
+There are two types of Reference datatypes in HDF5:
+\li \ref subsubsecLBDtypeSpecRefObj
+\li \ref subsubsecLBDtypeSpecRefDset
+
+\subsubsection subsubsecLBDtypeSpecRefObj Reference to objects
+In HDF5, objects (i.e. groups, datasets, and named datatypes) are usually accessed by name.
+There is another way to access stored objects -- by reference.
+
+An object reference is based on the relative file address of the object header in the file
+and is constant for the life of the object. Once a reference to an object is created and
+stored in a dataset in the file, it can be used to dereference the object it points to.
+References are handy for creating a file index or for grouping related objects by storing
+references to them in one dataset.
+
+<h4>Creating and storing references to objects</h4>
+The following steps are involved in creating and storing file references to objects:
+<ol>
+<li>Create the objects or open them if they already exist in the file.</li>
+<li>Create a dataset to store the objects' references, by specifying #H5T_STD_REF_OBJ as the datatype</li>
+<li>Create and store references to the objects in a buffer, using #H5Rcreate.</li>
+<li>Write a buffer with the references to the dataset, using #H5Dwrite with the #H5T_STD_REF_OBJ datatype.</li>
+</ol>
+
+<h4>Reading references and accessing objects using references</h4>
+The following steps are involved:
+<ol>
+<li>Open the dataset with the references and read them. The #H5T_STD_REF_OBJ datatype must be used to describe the memory datatype.</li>
+<li>Use the read reference to obtain the identifier of the object the reference points to using #H5Rdereference.</li>
+<li>Open the dereferenced object and perform the desired operations.</li>
+<li>Close all objects when the task is complete.</li>
+</ol>
+
+\subsubsection subsubsecLBDtypeSpecRefDset Reference to a dataset region
+A dataset region reference points to a dataset selection in another dataset.
+A reference to the dataset selection (region) is constant for the life of the dataset.
+
+<h4>Creating and storing references to dataset regions</h4>
+The following steps are involved in creating and storing references to a dataset region:
+\li Create a dataset to store the dataset region (selection), by passing in #H5T_STD_REF_DSETREG for the datatype when calling #H5Dcreate.
+\li Create selection(s) in existing dataset(s) using #H5Sselect_hyperslab and/or #H5Sselect_elements.
+\li Create reference(s) to the selection(s) using #H5Rcreate and store them in a buffer.
+\li Write the references to the dataset regions in the file.
+\li Close all objects.
+
+<h4>Reading references to dataset regions</h4>
+The following steps are involved in reading references to dataset regions and referenced dataset regions (selections).
+<ol>
+<li>Open and read the dataset containing references to the dataset regions.
+The datatype #H5T_STD_REF_DSETREG must be used during read operation.</li>
+<li>Use #H5Rdereference to obtain the dataset identifier from the read dataset region reference.
+ OR
+ Use #H5Rget_region to obtain the dataspace identifier for the dataset containing the selection from the read dataset region reference.
+</li>
+<li>With the dataspace identifier, the \ref H5S interface functions, H5Sget_select_*,
+can be used to obtain information about the selection.</li>
+<li>Close all objects when they are no longer needed.</li>
+</ol>
+
+The dataset with the region references was read by #H5Dread with the #H5T_STD_REF_DSETREG datatype specified.
+
+The read reference can be used to obtain the dataset identifier by calling #H5Rdereference or by obtaining
+obtain spacial information (dataspace and selection) with the call to #H5Rget_region.
+
+The reference to the dataset region has information for both the dataset itself and its selection. In both functions:
+\li The first parameter is an identifier of the dataset with the region references.
+\li The second parameter specifies the type of reference stored. In this example, a reference to the dataset region is stored.
+\li The third parameter is a buffer containing the reference of the specified type.
+
+This example introduces several H5Sget_select_* functions used to obtain information about selections:
+<table>
+<caption>Examples of HDF5 predefined datatypes</caption>
+<tr>
+<th><strong>Function</strong></th>
+<th><strong>Description</strong></th>
+</tr>
+<tr>
+<td>#H5Sget_select_npoints</td>
+<td>Returns the number of elements in the hyperslab</td>
+</tr>
+<tr>
+<td>#H5Sget_select_hyper_nblocks</td>
+<td>Returns the number of blocks in the hyperslab</td>
+</tr>
+<tr>
+<td>#H5Sget_select_hyper_blocklist</td>
+<td>Returns the "lower left" and "upper right" coordinates of the blocks in the hyperslab selection</td>
+</tr>
+<tr>
+<td>#H5Sget_select_bounds</td>
+<td>Returns the coordinates of the "minimal" block containing a hyperslab selection</td>
+</tr>
+<tr>
+<td>#H5Sget_select_elem_npoints</td>
+<td>Returns the number of points in the element selection</td>
+</tr>
+<tr>
+<td>#H5Sget_select_elem_pointlist</td>
+<td>Returns the coordinates of points in the element selection</td>
+</tr>
+</table>
+
+\subsection subsecLBDtypeSpecStr String
+A simple example of creating a derived datatype is using the string datatype,
+#H5T_C_S1 (#H5T_FORTRAN_S1) to create strings of more than one character. Strings
+can be stored as either fixed or variable length, and may have different rules
+for padding of unused storage.
+
+\subsubsection subsecLBDtypeSpecStrFix Fixed Length 5-character String Datatype
+\code
+ hid_t strtype; /* Datatype ID */
+ herr_t status;
+
+ strtype = H5Tcopy (H5T_C_S1);
+ status = H5Tset_size (strtype, 5); /* create string of length 5 */
+\endcode
+
+\subsubsection subsecLBDtypeSpecStrVar Variable Length String Datatype
+\code
+ strtype = H5Tcopy (H5T_C_S1);
+ status = H5Tset_size (strtype, H5T_VARIABLE);
+\endcode
+
+The ability to derive datatypes from pre-defined types allows users to create any number of datatypes,
+from simple to very complex.
+
+As the term implies, variable length strings are strings of varying lengths. They are stored internally
+in a heap, potentially impacting efficiency in the following ways:
+\li Heap storage requires more space than regular raw data storage.
+\li Heap access generally reduces I/O efficiency because it requires individual read or write operations
+for each data element rather than one read or write per dataset or per data selection.
+\li A variable length dataset consists of pointers to the heaps of data, not the actual data. Chunking
+and filters, including compression, are not available for heaps.
+
+See \ref subsubsec_datatype_other_strings in the \ref UG, for more information on how fixed and variable
+length strings are stored.
+
+\subsection subsecLBDtypeSpecVL Variable Length
+Variable-length (VL) datatypes are sequences of an existing datatype (atomic, VL, or compound)
+which are not fixed in length from one dataset location to another. In essence, they are similar
+to C character strings -- a sequence of a type which is pointed to by a particular type of
+pointer -- although they are implemented more closely to FORTRAN strings by including an explicit
+length in the pointer instead of using a particular value to terminate the sequence.
+
+VL datatypes are useful to the scientific community in many different ways, some of which are listed below:
+<ul>
+<li>Ragged arrays: Multi-dimensional ragged arrays can be implemented with the last (fastest changing)
+dimension being ragged by using a VL datatype as the type of the element stored. (Or as a field in a compound datatype.)
+</li>
+<li>Fractal arrays: If a compound datatype has a VL field of another compound type with VL fields
+(a nested VL datatype), this can be used to implement ragged arrays of ragged arrays, to whatever
+nesting depth is required for the user.
+</li>
+<li>Polygon lists: A common storage requirement is to efficiently store arrays of polygons with
+different numbers of vertices. VL datatypes can be used to efficiently and succinctly describe an
+array of polygons with different numbers of vertices.
+</li>
+<li>Character strings: Perhaps the most common use of VL datatypes will be to store C-like VL character
+strings in dataset elements or as attributes of objects.
+</li>
+<li>Indices: An array of VL object references could be used as an index to all the objects in a file
+which contain a particular sequence of dataset values. Perhaps an array something like the following:
+\code
+ Value1: Object1, Object3, Object9
+ Value2: Object0, Object12, Object14, Object21, Object22
+ Value3: Object2
+ Value4: <none>
+ Value5: Object1, Object10, Object12
+ .
+ .
+\endcode
+</li>
+<li>Object Tracking: An array of VL dataset region references can be used as a method of tracking
+objects or features appearing in a sequence of datasets. Perhaps an array of them would look like:
+\code
+ Feature1: Dataset1:Region, Dataset3:Region, Dataset9:Region
+ Feature2: Dataset0:Region, Dataset12:Region, Dataset14:Region,
+ Dataset21:Region, Dataset22:Region
+ Feature3: Dataset2:Region
+ Feature4: <none>
+ Feature5: Dataset1:Region, Dataset10:Region, Dataset12:Region
+ .
+ .
+\endcode
+</li>
+</ul>
+
+\subsubsection subsubsecLBDtypeSpecVLMem Variable-length datatype memory management
+With each element possibly being of different sequence lengths for a dataset with a VL datatype,
+the memory for the VL datatype must be dynamically allocated. Currently there are two methods
+of managing the memory for VL datatypes: the standard C malloc/free memory allocation routines
+or a method of calling user-defined memory management routines to allocate or free memory. Since
+the memory allocated when reading (or writing) may be complicated to release, an HDF5 routine is
+provided to traverse a memory buffer and free the VL datatype information without leaking memory.
+
+\subsubsection subsubsecLBDtypeSpecVLDiv Variable-length datatypes cannot be divided
+VL datatypes are designed so that they cannot be subdivided by the library with selections, etc.
+This design was chosen due to the complexities in specifying selections on each VL element of a
+dataset through a selection API that is easy to understand. Also, the selection APIs work on
+dataspaces, not on datatypes. At some point in time, we may want to create a way for dataspaces
+to have VL components to them and we would need to allow selections of those VL regions, but
+that is beyond the scope of this document.
+
+\subsubsection subsubsecLBDtypeSpecVLErr What happens if the library runs out of memory while reading?
+It is possible for a call to #H5Dread to fail while reading in VL datatype information if the memory
+required exceeds that which is available. In this case, the #H5Dread call will fail gracefully and any
+VL data which has been allocated prior to the memory shortage will be returned to the system via the
+memory management routines detailed below. It may be possible to design a partial read API function
+at a later date, if demand for such a function warrants.
+
+\subsubsection subsubsecLBDtypeSpecVLStr Strings as variable-length datatypes
+Since character strings are a special case of VL data that is implemented in many different ways on
+different machines and in different programming languages, they are handled somewhat differently from
+other VL datatypes in HDF5.
+
+HDF5 has native VL strings for each language API, which are stored the same way on disk, but are
+exported through each language API in a natural way for that language. When retrieving VL strings
+from a dataset, users may choose to have them stored in memory as a native VL string or in HDF5's
+#hvl_t struct for VL datatypes.
+
+VL strings may be created in one of two ways: by creating a VL datatype with a base type of
+#H5T_C_S1 and setting its length to #H5T_VARIABLE. The second method is used to access native VL strings in memory. The
+library will convert between the two types, but they are stored on disk using different datatypes
+and have different memory representations.
+
+Multi-byte character representations, such as \em UNICODE or \em wide characters in C/C++, will need the
+appropriate character and string datatypes created so that they can be described properly through
+the datatype API. Additional conversions between these types and the current ASCII characters
+will also be required.
+
+Variable-width character strings (which might be compressed data or some other encoding) are not
+currently handled by this design. We will evaluate how to implement them based on user feedback.
+
+\subsubsection subsubsecLBDtypeSpecVLAPIs Variable-length datatype APIs
+
+<h4>Creation</h4>
+VL datatypes are created with the #H5Tvlen_create function as follows:
+\code
+type_id = H5Tvlen_create(hid_t base_type_id);
+\endcode
+The base datatype will be the datatype that the sequence is composed of, characters for character
+strings, vertex coordinates for polygon lists, etc. The base datatype specified for the VL datatype
+can be of any HDF5 datatype, including another VL datatype, a compound datatype, or an atomic datatype.
+
+<h4>Querying base datatype of VL datatype</h4>
+It may be necessary to know the base datatype of a VL datatype before memory is allocated, etc.
+The base datatype is queried with the #H5Tget_super function, described in the \ref H5T documentation.
+
+<h4>Querying minimum memory required for VL information</h4>
+It order to predict the memory usage that #H5Dread may need to allocate to store VL data while
+reading the data, the #H5Dvlen_get_buf_size function is provided:
+\code
+herr_t H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id, hsize_t *size)
+\endcode
+This routine checks the number of bytes required to store the VL data from the dataset, using
+the \em space_id for the selection in the dataset on disk and the \em type_id for the memory representation
+of the VL data in memory. The *\em size value is modified according to how many bytes are required
+to store the VL data in memory.
+
+<h4>Specifying how to manage memory for the VL datatype</h4>
+The memory management method is determined by dataset transfer properties passed into the
+#H5Dread and #H5Dwrite functions with the dataset transfer property list.
+
+Default memory management is set by using #H5P_DEFAULT for the dataset transfer
+property list identifier. If #H5P_DEFAULT is used with #H5Dread, the system \em malloc and \em free
+calls will be used for allocating and freeing memory. In such a case, #H5P_DEFAULT should
+also be passed as the property list identifier to #H5Dvlen_reclaim.
+
+The rest of this subsection is relevant only to those who choose not to use default memory management.
+
+The user can choose whether to use the system \em malloc and \em free calls or user-defined, or custom,
+memory management functions. If user-defined memory management functions are to be used, the
+memory allocation and free routines must be defined via #H5Pset_vlen_mem_manager(), as follows:
+\code
+herr_t H5Pset_vlen_mem_manager(hid_t plist_id, H5MM_allocate_t alloc, void *alloc_info, H5MM_free_t free, void *free_info)
+\endcode
+The \em alloc and \em free parameters identify the memory management routines to be used. If the user
+has defined custom memory management routines, \em alloc and/or \em free should be set to make those
+routine calls (i.e., the name of the routine is used as the value of the parameter); if the user
+prefers to use the system's \em malloc and/or \em free, the \em alloc and \em free parameters, respectively, should be set to \em NULL
+
+The prototypes for the user-defined functions would appear as follows:
+\code
+typedef void *(*H5MM_allocate_t)(size_t size, void *info) ; typedef void (*H5MM_free_t)(void *mem, void *free_info) ;
+\endcode
+The \em alloc_info and \em free_info parameters can be used to pass along any required information to
+the user's memory management routines.
+
+In summary, if the user has defined custom memory management routines, the name(s) of the routines
+are passed in the \em alloc and \em free parameters and the custom routines' parameters are passed in the
+\em alloc_info and \em free_info parameters. If the user wishes to use the system \em malloc and \em free functions,
+the \em alloc and/or \em free parameters are set to \em NULL and the \em alloc_info and \em free_info parameters are ignored.
+
+<h4>Recovering memory from VL buffers read in</h4>
+The complex memory buffers created for a VL datatype may be reclaimed with the #H5Dvlen_reclaim
+function call, as follows:
+\code
+herr_t H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf);
+\endcode
+
+The \em type_id must be the datatype stored in the buffer, \em space_id describes the selection for the
+memory buffer to free the VL datatypes within, \em plist_id is the dataset transfer property list
+which was used for the I/O transfer to create the buffer, and \em buf is the pointer to the buffer
+to free the VL memory within. The VL structures (#hvl_t) in the user's buffer are modified to zero
+out the VL information after it has been freed.
+
+If nested VL datatypes were used to create the buffer, this routine frees them from the bottom up,
+releasing all the memory without creating memory leaks.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+*/
diff --git a/doxygen/dox/LearnBasics3.dox b/doxygen/dox/LearnBasics3.dox
new file mode 100644
index 0000000..2fe0f52
--- /dev/null
+++ b/doxygen/dox/LearnBasics3.dox
@@ -0,0 +1,1015 @@
+/** @page LBPropsList Property Lists Basics
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBPList What is a Property (or Property List)?
+In HDF5, a property or property list is a characteristic or feature associated with an HDF5 object.
+There are default properties which handle the most common needs. These default properties are
+specified by passing in #H5P_DEFAULT for the Property List parameter of a function. Default properties
+can be modified by use of the \ref H5P interface and function parameters.
+
+The \ref H5P API allows a user to take advantage of the more powerful features in HDF5. It typically
+supports unusual cases when creating or accessing HDF5 objects. There is a programming model for
+working with Property Lists in HDF5 (see below).
+
+For examples of modifying a property list, see these tutorial topics:
+\li \see \ref LBDsetLayout
+\li \see \ref LBExtDset
+\li \see \ref LBComDset
+
+There are many Property Lists associated with creating and accessing objects in HDF5. See the
+\ref H5P Interface documentation in the HDF5 \ref RM for a list of the different
+properties associated with HDF5 interfaces.
+
+In summary:
+\li Properties are features of HDF5 objects, that can be changed by use of the Property List API and function parameters.
+\li Property lists provide a mechanism for adding functionality to HDF5 calls without increasing the number of arguments used for a given call.
+\li The Property List API supports unusual cases when creating and accessing HDF5 objects.
+
+\section secLBPListProg Programming Model
+Default properties are specified by simply passing in #H5P_DEFAULT (C) / H5P_DEFAULT_F (F90) for
+the property list parameter in those functions for which properties can be changed.
+
+The programming model for changing a property list is as follows:
+\li Create a copy or "instance" of the desired pre-defined property type, using the #H5Pcreate call. This
+will return a property list identifier. Please see the \ref RM entry for #H5Pcreate, for a comprehensive
+list of the property types.
+\li With the property list identifier, modify the property, using the \ref H5P APIs.
+\li Modify the object feature, by passing the property list identifier into the corresponding HDF5 object function.
+\li Close the property list when done, using #H5Pclose.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBDsetLayout Dataset Storage Layout
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBDsetLayoutDesc Description of a Dataset
+
+\section secLBDsetLayout Dataset Storage Layout
+The storage information, or storage layout, defines how the raw data values in the dataset are
+physically stored on disk. There are three ways that a dataset can be stored:
+\li contiguous
+\li chunked
+\li compact
+
+See the #H5Pset_layout/#H5Pget_layout APIs for details.
+
+\subsection subsecLBDsetLayoutCont Contiguous
+If the storage layout is contiguous, then the raw data values will be stored physically adjacent
+to each other in the HDF5 file (in one contiguous block). This is the default layout for a dataset.
+In other words, if you do not explicitly change the storage layout for the dataset, then it will
+be stored contiguously.
+<table>
+<tr>
+<td>
+\image html tutr-locons.png
+</td>
+</tr>
+</table>
+
+\subsection subsecLBDsetLayoutChunk Chunked
+With a chunked storage layout the data is stored in equal-sized blocks or chunks of
+a pre-defined size. The HDF5 library always writes and reads the entire chunk:
+<table>
+<tr>
+<td>
+\image html tutr-lochk.png
+</td>
+</tr>
+</table>
+
+Each chunk is stored as a separate contiguous block in the HDF5 file. There is a chunk index
+which keeps track of the chunks associated with a dataset:
+<table>
+<tr>
+<td>
+\image html tutr-lochks.png
+</td>
+</tr>
+</table>
+
+
+\subsubsection susubsecLBDsetLayoutChunkWhy Why Chunking ?
+Chunking is required for enabling compression and other filters, as well as for creating extendible
+or unlimited dimension datasets.
+
+It is also commonly used when subsetting very large datasets. Using the chunking layout can
+greatly improve performance when subsetting large datasets, because only the chunks required
+will need to be accessed. However, it is easy to use chunking without considering the consequences
+of the chunk size, which can lead to strikingly poor performance.
+
+Note that a chunk always has the same rank as the dataset and the chunk's dimensions do not need
+to be factors of the dataset dimensions.
+
+Writing or reading a chunked dataset is transparent to the application. You would use the same
+set of operations that you would use for a contiguous dataset. For example:
+\code
+ H5Dopen (...);
+ H5Sselect_hyperslab (...);
+ H5Dread (...);
+\endcode
+
+\subsubsection susubsecLBDsetLayoutChunkProb Problems Using Chunking
+Issues that can cause performance problems with chunking include:
+\li Chunks are too small.
+If a very small chunk size is specified for a dataset it can cause the dataset to be excessively
+large and it can result in degraded performance when accessing the dataset. The smaller the chunk
+size the more chunks that HDF5 has to keep track of, and the more time it will take to search for a chunk.
+\li Chunks are too large.
+An entire chunk has to be read and uncompressed before performing an operation. There can be a
+performance penalty for reading a small subset, if the chunk size is substantially larger than
+the subset. Also, a dataset may be larger than expected if there are chunks that only contain a
+small amount of data.
+\li A chunk does not fit in the Chunk Cache.
+Every chunked dataset has a chunk cache associated with it that has a default size of 1 MB. The
+purpose of the chunk cache is to improve performance by keeping chunks that are accessed frequently
+in memory so that they do not have to be accessed from disk. If a chunk is too large to fit in the
+chunk cache, it can significantly degrade performance. However, the size of the chunk cache can be
+increased by calling #H5Pset_chunk_cache.
+
+It is a good idea to:
+\li Avoid very small chunk sizes, and be aware of the 1 MB chunk cache size default.
+\li Test the data with different chunk sizes to determine the optimal chunk size to use.
+\li Consider the chunk size in terms of the most common access patterns that will be used once the dataset has been created.
+
+\subsection subsecLBDsetLayoutCom Compact
+A compact dataset is one in which the raw data is stored in the object header of the dataset.
+This layout is for very small datasets that can easily fit in the object header.
+
+The compact layout can improve storage and access performance for files that have many very tiny
+datasets. With one I/O access both the header and data values can be read. The compact layout reduces
+the size of a file, as the data is stored with the header which will always be allocated for a dataset.
+However, the object header is 64 KB in size, so this layout can only be used for very small datasets.
+
+\section secLBDsetLayoutProg Programming Model to Modify the Storage Layout
+To modify the storage layout, the following steps must be done:
+\li Create a Dataset Creation Property list. (See #H5Pcreate)
+\li Modify the property list.
+To use chunked storage layout, call: #H5Pset_chunk
+To use the compact storage layout, call: #H5Pset_layout
+\li Create a dataset with the modified property list. (See #H5Dcreate)
+\li Close the property list. (See #H5Pclose)
+For example code, see the \ref HDF5Examples page.
+Specifically look at the <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a>.
+There are examples for different languages.
+
+The C example to create a chunked dataset is:
+<a href="https://support.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/C/H5D/h5ex_d_chunk.c">h5ex_d_chunk.c</a>
+The C example to create a compact dataset is:
+<a href="https://support.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/C/H5D/h5ex_d_compact.c">h5ex_d_compact.c</a>
+
+\section secLBDsetLayoutChange Changing the Layout after Dataset Creation
+The dataset layout is a Dataset Creation Property List. This means that once the dataset has been
+created the dataset layout cannot be changed. The h5repack utility can be used to write a file
+to a new with a new layout.
+
+\section secLBDsetLayoutSource Sources of Information
+<a href="https://confluence.hdfgroup.org/display/HDF5/Chunking+in+HDF5">Chunking in HDF5</a>
+(See the documentation on <a href="https://confluence.hdfgroup.org/display/HDF5/Advanced+Topics+in+HDF5">Advanced Topics in HDF5</a>)
+\see \ref sec_plist in the HDF5 \ref UG.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+
+@page LBExtDset Extendible Datasets
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBExtDsetCreate Creating an Extendible Dataset
+An extendible dataset is one whose dimensions can grow. HDF5 allows you to define a dataset to have
+certain initial dimensions, then to later increase the size of any of the initial dimensions.
+
+HDF5 requires you to use chunking to define extendible datasets. This makes it possible to extend
+datasets efficiently without having to excessively reorganize storage. (To use chunking efficiently,
+be sure to see the advanced topic, <a href="https://confluence.hdfgroup.org/display/HDF5/Chunking+in+HDF5">Chunking in HDF5</a>.)
+
+The following operations are required in order to extend a dataset:
+\li Declare the dataspace of the dataset to have unlimited dimensions for all dimensions that might eventually be extended.
+\li Set dataset creation properties to enable chunking.
+\li Create the dataset.
+\li Extend the size of the dataset.
+
+\section secLBExtDsetProg Programming Example
+
+\subsection subsecLBExtDsetProgDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example shows how to create a 3 x 3 extendible dataset, write to that dataset, extend the dataset
+to 10x3, and write to the dataset again.
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection subsecLBExtDsetProgRem Remarks
+\li An unlimited dimension dataspace is specified with the #H5Screate_simple call, by passing in
+#H5S_UNLIMITED as an element of the maxdims array.
+\li The #H5Pcreate call creates a new property as an instance of a property list class. For creating
+an extendible array dataset, pass in #H5P_DATASET_CREATE for the property list class.
+\li The #H5Pset_chunk call modifies a Dataset Creation Property List instance to store a chunked
+layout dataset and sets the size of the chunks used.
+\li To extend an unlimited dimension dataset use the the #H5Dset_extent call. Please be aware that
+after this call, the dataset's dataspace must be refreshed with #H5Dget_space before more data can be accessed.
+\li The #H5Pget_chunk call retrieves the size of chunks for the raw data of a chunked layout dataset.
+\li Once there is no longer a need for a Property List instance, it should be closed with the #H5Pclose call.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBComDset Compressed Datasets
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBComDsetCreate Creating a Compressed Dataset
+HDF5 requires you to use chunking to create a compressed dataset. (To use chunking efficiently,
+be sure to see the advanced topic, <a href="https://confluence.hdfgroup.org/display/HDF5/Chunking+in+HDF5">Chunking in HDF5</a>.)
+
+The following operations are required in order to create a compressed dataset:
+\li Create a dataset creation property list.
+\li Modify the dataset creation property list instance to enable chunking and to enable compression.
+\li Create the dataset.
+\li Close the dataset creation property list and dataset.
+
+For more information on compression, see the FAQ question on <a href="https://confluence.hdfgroup.org/display/HDF5/Using+Compression+in+HDF5">Using Compression in HDF5</a>.
+
+\section secLBComDsetProg Programming Example
+
+\subsection subsecLBComDsetProgDesc Description
+See \ref LBExamples for the examples used in the \ref LearnBasics tutorial.
+
+The example creates a chunked and ZLIB compressed dataset. It also includes comments for what needs
+to be done to create an SZIP compressed dataset. The example then reopens the dataset, prints the
+filter information, and reads the dataset.
+
+For details on compiling an HDF5 application:
+[ \ref LBCompiling ]
+
+\subsection subsecLBComDsetProgRem Remarks
+\li The #H5Pset_chunk call modifies a Dataset Creation Property List instance to store a chunked layout
+dataset and sets the size of the chunks used.
+\li The #H5Pset_deflate call modifies the Dataset Creation Property List instance to use ZLIB or DEFLATE
+compression. The #H5Pset_szip call modifies it to use SZIP compression. There are different compression
+parameters required for each compression method.
+\li SZIP compression can only be used with atomic datatypes that are integer, float, or char. It cannot be
+applied to compound, array, variable-length, enumerations, or other user-defined datatypes. The call
+to #H5Dcreate will fail if attempting to create an SZIP compressed dataset with a non-allowed datatype.
+The conflict can only be detected when the property list is used.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBContents Discovering the Contents of an HDF5 File
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBContents Discovering what is in an HDF5 file
+HDFView and h5dump are standalone tools which cannot be called within an application, and using
+#H5Dopen and #H5Dread require that you know the name of the HDF5 dataset. How would an application
+that has no prior knowledge of an HDF5 file be able to determine or discover the contents of it,
+much like HDFView and h5dump?
+
+The answer is that there are ways to discover the contents of an HDF5 file, by using the
+\ref H5G, \ref H5L and \ref H5O APIs:
+\li The \ref H5G interface (covered earlier) consists of routines for working with groups. A group is
+a structure that can be used to organize zero or more HDF5 objects, not unlike a Unix directory.
+\li The \ref H5L interface consists of link routines. A link is a path between groups. The \ref H5L interface
+allows objects to be accessed by use of these links.
+\li The \ref H5O interface consists of routines for working with objects. Datasets, groups, and committed
+datatypes are all objects in HDF5.
+
+Interface routines that simplify the process:
+\li #H5Literate traverses the links in a specified group, in the order of the specified index, using a
+user-defined callback routine. (A callback function is one that will be called when a certain condition
+is met, at a certain point in the future.)
+\li #H5Ovisit / #H5Lvisit recursively visit all objects/links accessible from a specified object/group.
+
+
+\section secLBContentsProg Programming Example
+
+\subsection subsecLBContentsProgUsing Using #H5Literate, #H5Lvisit and #H5Ovisit
+For example code, see the \ref HDF5Examples page.
+Specifically look at the <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a>.
+There are examples for different languages, where examples of using #H5Literate and #H5Ovisit/#H5Lvisit are included.
+
+The h5ex_g_traverse example traverses a file using H5Literate:
+\li C: <a href="https://support.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/C/H5G/h5ex_g_traverse.c">h5ex_g_traverse.c</a>
+\li F90: <a href="https://support.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/FORTRAN/H5G/h5ex_g_traverse_F03.f90">h5ex_g_traverse_F03.f90</a>
+
+The h5ex_g_visit example traverses a file using H5Ovisit and H5Lvisit:
+\li C: <a href="https://support.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/C/H5G/h5ex_g_visit.c">h5ex_g_visit.c</a>
+\li F90: <a href="https://support.hdfgroup.org/ftp/HDF5/examples/examples-by-api/hdf5-examples/1_8/FORTRAN/H5G/h5ex_g_visit_F03.f90">h5ex_g_visit_F03.f90</a>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBQuiz Learning the basics QUIZ
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\ref LBFileOrg
+<ol>
+<li>Name and describe the two primary objects that can be stored in an HDF5 file.
+</li>
+<li>What is an attribute?
+</li>
+<li>Give the path name for an object called <code style="background-color:whitesmoke;">harry</code> that is a member of a group called <code style="background-color:whitesmoke;">dick</code>, which, in turn, is a member of the root group.
+</li>
+</ol>
+
+\ref LBAPI
+<ol>
+<li>Describe the purpose of each of the following HDF5 APIs:
+\code
+ H5A, H5D, H5E, H5F, H5G, H5T, H5Z
+\endcode
+</li>
+</ol>
+
+\ref LBFileCreate
+<ol>
+<li>What two HDF5 routines must be called to create an HDF5 file?
+</li>
+<li>What include file must be included in any file that uses the HDF5 library?
+</li>
+<li>An HDF5 file is never completely empty because as soon as it is created, it automatically contains a certain primary object. What is that object?
+</li>
+</ol>
+
+\ref LBDsetCreate
+<ol>
+<li>Name and describe two major datatype categories.
+</li>
+<li>List the HDF5 atomic datatypes. Give an example of a predefined datatype. How would you create a string dataset?
+</li>
+<li>What does the dataspace describe? What are the major characteristics of the simple dataspace?
+</li>
+<li>What information needs to be passed to the #H5Dcreate function, i.e., what information is needed to describe a dataset at creation time?
+</li>
+</ol>
+
+
+\ref LBDsetRW
+<ol>
+<li>What are six pieces of information which need to be specified for reading and writing a dataset?
+</li>
+<li>Why are both the memory dataspace and file dataspace needed for read/write operations, while only the memory datatype is required?
+</li>
+<li>In Figure 6.1, what does this line mean?
+\code
+DATASPACE { SIMPLE (4 , 6 ) / ( 4 , 6 ) }
+\endcode
+</li>
+</ol>
+
+
+\ref LBAttrCreate
+<ol>
+<li>What is an attribute?
+</li>
+<li>Can partial I/O operations be performed on attributes?
+</li>
+</ol>
+
+
+\ref LBGrpCreate
+<ol>
+<li>What are the two primary objects that can be included in a group?
+</li>
+</ol>
+
+
+\ref LBGrpCreateNames
+<ol>
+<li>Group names can be specified in two ways. What are these two types of group names?
+</li>
+<li>You have a dataset named <code style="background-color:whitesmoke;">moo</code> in the group <code style="background-color:whitesmoke;">boo</code>, which is in the group <code style="background-color:whitesmoke;">foo</code>, which, in turn,
+is in the <code style="background-color:whitesmoke;">root</code> group. How would you specify an absolute name to access this dataset?
+</li>
+</ol>
+
+
+\ref LBGrpDset
+<ol>
+<li>Describe a way to access the dataset moo described in the previous section
+(question 2) using a relative name. Describe a way to access the same dataset using an absolute name.
+</li>
+</ol>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBQuizAnswers Learning the basics QUIZ with Answers
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\ref LBFileOrg
+<ol>
+<li>Name and describe the two primary objects that can be stored in an HDF5 file.
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>Group: A grouping structure containing zero or more HDF5 objects, together with supporting metadata.<br />
+Dataset: A multidimensional array of data elements, together with supporting metadata.
+</td>
+</tr>
+</table>
+</li>
+<li>What is an attribute?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>An HDF5 attribute is a user-defined HDF5 structure that provides extra information about an HDF5 object.
+</td>
+</tr>
+</table>
+</li>
+<li>Give the path name for an object called <code style="background-color:whitesmoke;">harry</code> that is a member of a group called <code style="background-color:whitesmoke;">dick</code>, which, in turn, is a member of the root group.
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>/dick/harry
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+\ref LBAPI
+<ol>
+<li>Describe the purpose of each of the following HDF5 APIs:
+\code
+ H5A, H5D, H5E, H5F, H5G, H5T, H5Z
+\endcode
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>H5A: Attribute access and manipulation routines
+<br />
+H5D: Dataset access and manipulation routines
+<br />
+H5E: Error handling routines H5F: File access routines
+<br />
+H5G: Routines for creating and operating on groups
+<br />
+H5T: Routines for creating and manipulating the datatypes of dataset elements
+<br />
+H5Z: Data compression routines
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+\ref LBFileCreate
+<ol>
+<li>What two HDF5 routines must be called to create an HDF5 file?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>#H5Fcreate and #H5Fclose.
+</td>
+</tr>
+</table>
+</li>
+<li>What include file must be included in any file that uses the HDF5 library?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>hdf5.h must be included because it contains definitions and declarations used by the library.
+</td>
+</tr>
+</table>
+</li>
+<li>An HDF5 file is never completely empty because as soon as it is created, it automatically contains a certain primary object. What is that object?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>The root group.
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+\ref LBDsetCreate
+<ol>
+<li>Name and describe two major datatype categories.
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>Atomic datatype: An atomic datatype cannot be decomposed into smaller units at the API level.
+<br />
+Compound datatype: A compound datatype is a collection of atomic and compound datatypes, or small arrays of such types.
+</td>
+</tr>
+</table>
+</li>
+<li>List the HDF5 atomic datatypes. Give an example of a predefined datatype. How would you create a string dataset?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>There are six HDF5 atomic datatypes: integer, floating point, date and time, character string, bit field, and opaque.
+<br />
+Examples of predefined datatypes include the following:<br />
+\li #H5T_IEEE_F32LE - 4-byte little-endian, IEEE floating point
+\li #H5T_NATIVE_INT - native integer
+
+You would create a string dataset with the #H5T_C_S1 datatype, and set the size of the string with the #H5Tset_size call.
+</td>
+</tr>
+</table>
+</li>
+<li>What does the dataspace describe? What are the major characteristics of the simple dataspace?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>The dataspace describes the dimensionality of the dataset. A simple dataspace is characterized by its rank and dimension sizes.
+</td>
+</tr>
+</table>
+</li>
+<li>What information needs to be passed to the #H5Dcreate function, i.e., what information is needed to describe a dataset at creation time?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>The dataset location, name, dataspace, datatype, and dataset creation property list.
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+
+\ref LBDsetRW
+<ol>
+<li>What are six pieces of information which need to be specified for reading and writing a dataset?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>The dataset identifier, the dataset's datatype and dataspace in memory, the dataspace in the file,
+the dataset transfer property list, and a data buffer.
+</td>
+</tr>
+</table>
+</li>
+<li>Why are both the memory dataspace and file dataspace needed for read/write operations, while only the memory datatype is required?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>A dataset's file datatype is not required for a read/write operation because the file datatype is specified
+when the dataset is created and cannot be changed. Both file and memory dataspaces are required for dataset
+subsetting and for performing partial I/O operations.
+</td>
+</tr>
+</table>
+</li>
+<li>In Figure 6.1, what does this line mean?
+\code
+DATASPACE { SIMPLE (4 , 6 ) / ( 4 , 6 ) }
+\endcode
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>It means that the dataset dset has a simple dataspace with the current dimensions (4,6) and the maximum size of the dimensions (4,6).
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+
+\ref LBAttrCreate
+<ol>
+<li>What is an attribute?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>An attribute is a dataset attached to an object. It describes the nature and/or the intended usage of the object.
+</td>
+</tr>
+</table>
+</li>
+<li>Can partial I/O operations be performed on attributes?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>No.
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+
+\ref LBGrpCreate
+<ol>
+<li>What are the two primary objects that can be included in a group?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>A group and a dataset.
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+
+\ref LBGrpCreateNames
+<ol>
+<li>Group names can be specified in two ways. What are these two types of group names?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>Relative and absolute.
+</td>
+</tr>
+</table>
+</li>
+<li>You have a dataset named <code style="background-color:whitesmoke;">moo</code> in the group <code style="background-color:whitesmoke;">boo</code>, which is in the group <code style="background-color:whitesmoke;">foo</code>, which, in turn,
+is in the <code style="background-color:whitesmoke;">root</code> group. How would you specify an absolute name to access this dataset?
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>/foo/boo/moo
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+
+\ref LBGrpDset
+<ol>
+<li>Describe a way to access the dataset moo described in the previous section
+(question 2) using a relative name. Describe a way to access the same dataset using an absolute name.
+<table>
+<tr>
+<th><strong>Answer</strong>
+</th>
+<td>Access the group /foo and get the group ID. Access the group boo using the group ID obtained in Step 1.
+Access the dataset moo using the group ID obtained in Step 2.
+\code
+gid = H5Gopen (file_id, "/foo", 0); /* absolute path */
+gid1 = H5Gopen (gid, "boo", 0); /* relative path */
+did = H5Dopen (gid1, "moo"); /* relative path */
+\endcode
+Access the group /foo and get the group ID. Access the dataset boo/moo with the group ID just obtained.
+\code
+gid = H5Gopen (file_id, "/foo", 0); /* absolute path */
+did = H5Dopen (gid, "boo/moo"); /* relative path */
+\endcode
+Access the dataset with an absolute path.
+\code
+did = H5Dopen (file_id, "/foo/boo/moo"); /* absolute path */
+\endcode
+</td>
+</tr>
+</table>
+</li>
+</ol>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBCompiling Compiling HDF5 Applications
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+\section secLBCompiling Tools and Instructions on Compiling
+Compiling applications to use the HDF5 Library can be as simple as executing:
+\code
+h5cc -o myprog myprog.c
+\endcode
+
+As an application's file base evolves, there are better solutions using autotools and makefiles or
+CMake and CMakeLists.txt files. Many tutorials and references can be found with a simple search.
+
+This tutorial section will discuss the use of compile scripts on Linux.
+See the \ref secLBCompilingVS section for compiling with Visual Studio.
+
+\section secLBCompilingLinux Compile Scripts
+When the library is built, the following compile scripts are included:
+\li h5cc: compile script for HDF5 C programs
+\li h5fc: compile script for HDF5 F90 programs
+\li h5c++: compile script for HDF5 C++ programs
+
+These scripts are easilye used to compile single file applications, such as those included in the tutorial.
+<table>
+<tr>
+<th><strong>Warning</strong>
+</th>
+<td>The h5cc/h5fc/h5c++ compile scripts are included when building with configure. Versions of
+these compile scripts have also been added to CMake for Linux ONLY. The CMake versions rely on pkgconfig files.
+</td>
+</tr>
+</table>
+
+<h4>Examples of Using the Unix Compile Scripts:</h4>
+Following are examples of compiling and running an application with the Unix compile scripts:
+\code
+ h5fc myprog.f90
+ ./a.out
+
+ h5cc -o myprog myprog.c
+ ./myprog
+\endcode
+
+To see how the libraries linked in with a compile script were configured and built, use the
+-showconfig option. For example, if using h5cc type:
+\code
+ h5cc -showconfig
+\endcode
+
+<h4>Detailed Description of Unix Compile Scripts:</h4>
+The h5cc, h5c++, and h5fc compile scripts come with the HDF5 binary distributions (include files,
+libraries, and utilities) for the platforms we support. The h5c++ and h5fc utilities are ONLY present
+if the library was built with C++ and Fortran.
+
+\section secLBCompilingVS Using Visual Studio
+
+ 1. If you are building on 64-bit Windows, find the "Platform" dropdown
+ and select "x64". Also select the correct Configuration (Debug, Release, RelWithDebInfo, etc)
+
+ 2. Set up path for external headers
+
+ The HDF5 install path settings will need to be in the project property sheets per project.
+ Go to "Project" and select "Properties", find "Configuration Properties",
+ and then "C/C++".
+
+ 2.1 Add the header path to the "Additional Include Directories" setting. Under "C/C++"
+ find "General" and select "Additional Include Directories". Select "Edit" from the dropdown
+ and add the HDF5 install/include path to the list.
+ (Ex: "C:\Program Files\HDF_Group\HDF5\1.10.9\include")
+
+ 2.2 Building applications with the dynamic/shared hdf5 libraries requires
+ that the "H5_BUILT_AS_DYNAMIC_LIB" compile definition be used. Under "C/C++"
+ find "Preprocessor" and select "Preprocessor Definitions". Select "Edit" from the dropdown
+ and add "H5_BUILT_AS_DYNAMIC_LIB" to the list.
+
+ 3. Set up path for external libraries
+
+ The HDF5 install path/lib settings will need to be in the project property sheets per project.
+ Go to "Project" and select "Properties", find "Configuration Properties",
+ and then "Linker".
+
+ 3.1 Add the libraries to the "Additional Dependencies" setting. Under "Linker"
+ find "Input" and select "Additional Dependencies". Select "Edit" from the dropdown
+ and add the required HDF5 install/lib path to the list.
+ (Ex: "C:\Program Files\HDF_Group\HDF5\1.10.9\lib\hdf5.lib")
+
+ 3.2 For static builds, the external libraries should be added.
+ For example, to compile a C++ application, enter:
+ libhdf5_cpp.lib libhdf5.lib libz.lib libszaec.lib libaec.lib
+
+\section secLBCompilingLibs HDF5 Libraries
+Following are the libraries included with HDF5. Whether you are using the Unix compile scripts or
+Makefiles, or are compiling on Windows, these libraries are or may need to be specified. The order
+they are specified is important on Linux:
+
+<table>
+<caption>HDF5 Static Libraries</caption>
+<tr>
+<th>Library</th>
+<th>Linux Name</th>
+<th>Mac Name</th>
+<th>Windows Name</th>
+</tr>
+<tr>
+<td>
+\code
+HDF5 High Level C++ APIs
+HDF5 C++ Library
+HDF5 High Level Fortran APIs
+HDF5 Fortran Library
+HDF5 High Level C APIs
+HDF5 C Library
+\endcode
+</td>
+<td>
+\code
+libhdf5_hl_cpp.a
+libhdf5_cpp.a
+libhdf5hl_fortran.a
+libhdf5_fortran.a
+libhdf5_hl.a
+libhdf5.a
+\endcode
+</td>
+<td>
+\code
+libhdf5_hl_cpp.a
+libhdf5_cpp.a
+libhdf5hl_fortran.a
+libhdf5_fortran.a
+libhdf5_hl.a
+libhdf5.a
+\endcode
+</td>
+<td>
+<em>Windows</em>
+\code
+libhdf5_hl_cpp.lib
+libhdf5_cpp.lib
+libhdf5hl_fortran.lib
+libhdf5_fortran.lib
+libhdf5_hl.lib
+libhdf5.lib
+\endcode
+</tr>
+</table>
+
+<table>
+<caption>HDF5 Shared Libraries</caption>
+<tr>
+<th>Library</th>
+<th>Linux Name</th>
+<th>Mac Name</th>
+<th>Windows Name</th>
+</tr>
+<tr>
+<td>
+\code
+HDF5 High Level C++ APIs
+HDF5 C++ Library
+HDF5 High Level Fortran APIs
+HDF5 Fortran Library
+HDF5 High Level C APIs
+HDF5 C Library
+\endcode
+</td>
+<td>
+\code
+libhdf5_hl_cpp.so
+libhdf5_cpp.so
+libhdf5hl_fortran.so
+libhdf5_fortran.so
+libhdf5_hl.so
+libhdf5.so
+\endcode
+</td>
+<td>
+\code
+libhdf5_hl_cpp.dylib
+libhdf5_cpp.dylib
+libhdf5hl_fortran.dylib
+libhdf5_fortran.dylib
+libhdf5_hl.dylib
+libhdf5.dylib
+\endcode
+</td>
+<td>
+\code
+hdf5_hl_cpp.lib
+hdf5_cpp.lib
+hdf5hl_fortran.lib
+hdf5_fortran.lib
+hdf5_hl.lib
+hdf5.lib
+\endcode
+</tr>
+</table>
+
+<table>
+<caption>External Libraries</caption>
+<tr>
+<th>Library</th>
+<th>Linux Name</th>
+<th>Mac Name</th>
+<th>Windows Name</th>
+</tr>
+<tr>
+<td>
+\code
+SZIP Compression Library
+SZIP Compression Library
+ZLIB or DEFLATE Compression Library
+\endcode
+</td>
+<td>
+\code
+libszaec.a
+libaec.a
+libz.a
+\endcode
+</td>
+<td>
+\code
+libszaec.a
+libaec.a
+libz.a
+\endcode
+</td>
+<td>
+\code
+libszaec.lib
+libaec.lib
+libz.lib
+\endcode
+</td>
+</tr>
+</table>
+
+The pre-compiled binaries, in particular, are built (if at all possible) with these libraries as well as with
+SZIP and ZLIB. If using shared libraries you may need to add the path to the library to LD_LIBRARY_PATH on Linux
+or on WINDOWS you may need to add the path to the bin folder to PATH.
+
+\section secLBCompilingCMake Compiling an Application with CMake
+
+\subsection subsecLBCompilingCMakeScripts CMake Scripts for Building Applications
+Simple scripts are provided for building applications with different languages and options.
+See <a href="https://confluence.hdfgroup.org/display/support/CMake+Scripts+for+Building+Applications">CMake Scripts for Building Applications</a>.
+
+For a more complete script (and to help resolve issues) see the script provided with the HDF5 Examples project.
+
+\subsection subsecLBCompilingCMakeExamples HDF5 Examples
+The installed HDF5 can be verified by compiling the HDF5 Examples project, included with the CMake built HDF5 binaries
+in the share folder or you can go to the <a href="https://github.com/HDFGroup/hdf5_examples">HDF5 Examples</a> github repository.
+
+Go into the share directory and follow the instructions in USING_CMake_examples.txt to build the examples.
+
+In general, users must first set the HDF5_ROOT environment variable to the installed location of the CMake
+configuration files for HDF5. For example, on Windows the following path might be set:
+
+\code
+ HDF5_ROOT=C:/Program Files/HDF_Group/HDF5/1.N.N
+\endcode
+
+\subsection subsecLBCompilingCMakeTroubless Troubleshooting CMake
+<h4>How do you use find_package with HDF5?</h4>
+To use find_package you will first need to make sure that HDF5_ROOT is set correctly. For setting this
+environment variable see the Preconditions in the USING_HDF5_CMake.txt file in the share directory.
+
+See the CMakeLists.txt file provided with these examples for how to use find_package with HDF5.
+
+Please note that the find_package invocation changed to require "shared" or "static":
+\code
+ FIND_PACKAGE(HDF5 COMPONENTS C HL NO_MODULE REQUIRED shared)
+ FIND_PACKAGE(HDF5 COMPONENTS C HL NO_MODULE REQUIRED static)
+\endcode
+
+Previously, the find_package invocation was:
+\code
+ FIND_PACKAGE(HDF5 COMPONENTS C HL NO_MODULE REQUIRED)
+\endcode
+
+<h4>My platform/compiler is not included. Can I still use the configuration files?</h4>
+Yes, you can but you will have to edit the HDF5_Examples.cmake file and update the variable:
+\code
+ CTEST_CMAKE_GENERATOR
+\endcode
+
+The generators for your platform can be seen by typing:
+\code
+ cmake --help
+\endcode
+
+<h4>What do I do if the build fails?</h4>
+I received an error during the build and the application binary is not in the
+build directory as I expected. How do I determine what the problem is?
+
+If the error is not clear, then the first thing you may want to do is replace the -V (Dash Uppercase Vee)
+option for ctest in the build script to -VV (Dash Uppercase Vee Uppercase Vee). Then remove the build
+directory and re-run the build script. The output should be more verbose.
+
+If the error is still not clear, then check the log files. You will find those in the build directory.
+For example, on Unix the log files will be in:
+\code
+ build/Testing/Temporary/
+\endcode
+There are log files for the configure, test, and build.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+@page LBTraining Training Videos
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+<hr>
+
+<a href="https://confluence.hdfgroup.org/display/HDF5/Training+Videos">Training Videos</a>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics
+
+*/
diff --git a/doxygen/dox/LearnHDFView.dox b/doxygen/dox/LearnHDFView.dox
new file mode 100644
index 0000000..b1f632c
--- /dev/null
+++ b/doxygen/dox/LearnHDFView.dox
@@ -0,0 +1,472 @@
+/** @page LearnHDFView Learning HDF5 with HDFView
+
+Navigate back: \ref index "Main" / \ref GettingStarted
+<hr>
+
+This tutorial enables you to get a feel for HDF5 by using the HDFView browser. It does NOT require
+any programming experience.
+
+\section sec_learn_hv_install HDFView Installation
+\li Download and install HDFView. It can be downloaded from the <a href="https://portal.hdfgroup.org/display/support/Download+HDFView">Download HDFView</a> page.
+\li Obtain the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> text file, used in the tutorial.
+
+\section sec_learn_hv_begin Begin Tutorial
+Once you have HDFView installed, bring it up and you are ready to begin the tutorial.
+
+<table style="background-color:#FAFAD2">
+<caption>
+Unable to complete tutorial because fields are greyed out?
+</caption>
+<tr>
+<td>
+This tutorial requires that the default HDFView File Access Mode be Read / Write. If fields are greyed out so that you cannot select them, then the File Access Mode is Read Only.
+
+To change the File Access Mode follow these steps:
+<ul>
+<li>Bring up HDFView</li>
+<li>Left-mouse click on the Tools pull-down menu and select User Options.</li>
+<li>A Preferences window pops up with the General Settings tab selected.
+About half-way down you will see Default File Access Mode.
+Select Read / Write.</li>
+<li>Click on Apply and Close at the bottom of the window.</li>
+<li>Close down HDFView.</li>
+<li>Bring HDFView back up and try the tutorial again.</li>
+PLEASE BE AWARE that selecting a File Access Mode of Read / Write can result in changes to the timestamp of HDF files that are viewed with HDFView. In general, a File Access Mode
+of Read Only should be used to ensure that this does not occur.
+</ul>
+</td>
+</tr>
+</table>
+
+\subsection subsec_learn_hv_begin_topics Topics Covered
+Following are the topics covered in the tutorial. The first topic creates the file that is used in
+the subsequent topics.
+<ul>
+<li>@ref subsec_learn_hv_topics_file</li>
+<li>@ref subsec_learn_hv_topics_image</li>
+<li>@ref subsec_learn_hv_topics_attr</li>
+<li>@ref subsec_learn_hv_topics_compress</li>
+<li>@ref subsec_learn_hv_topics_subset</li>
+<li>@ref subsec_learn_hv_topics_table</li>
+</ul>
+
+\section sec_learn_hv_topics Topics
+
+\subsection subsec_learn_hv_topics_file Creating a New HDF5 File with a Contiguous Dataset
+The steps below describe how to create a file (storm.h5), group (/Data), and a contiguous dataset
+(/Data/Storm) using HDFView. A group is an HDF5 object that allows objects to be collected together.
+A dataset is an array of data values. A contiguous dataset is one that is stored as a single block
+in the HDF5 file.
+<ul>
+<li>Select the <em>File</em> pull-down menu at the top left, and then select <em>New -> HDF5</em>.</li>
+<li>Specify a location and type in <em>storm.h5</em> for the name of your file, and click on the <em>Save</em> button.
+You will see the <em>storm.h5</em> file in the TableView:
+<table>
+<tr>
+<td>
+\image html storm.png
+</td>
+</tr>
+</table>
+</li>
+<li>Right click on <em>storm.h5</em>, and select <em>New -> Group</em>.</li>
+<li>Enter <em>Data</em> for the name of the group and then click the <em>Ok</em> button. You will see the group <em>Data</em> in the TableView.
+<table>
+<tr>
+<td>
+\image html DataGroup.png
+</td>
+</tr>
+</table>
+</li>
+<li>Right click on the group <em>Data</em> and select <em>New -> Dataset</em>.</li>
+<li>A window pops up on the right. Fill in the information as follows, and then click <em>Ok</em> (leave the
+Datatype information as is):
+<table>
+<tr>
+<th>Dataset Name
+</th>
+<td><em>Storm</em>
+</td>
+</tr>
+<tr>
+<th>Under Dataspace, Current size
+</th>
+<td>57x57
+</td>
+</tr>
+<tr>
+<th>Layout
+</th>
+<td><em>Contiguous</em> (default)
+</td>
+</tr>
+</table>
+</li>
+<li>Click to expand the <em>Data</em> group in the tree view to see the <em>Storm</em> dataset:
+<table>
+<tr>
+<td>
+\image html StormDataset.png
+</td>
+</tr>
+</table>
+</li>
+<li>Double left click on the <em>Storm</em> dataset in the tree view. A window with an empty spreadsheet pops open.</li>
+<li>Copy the data from the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset.
+
+If you downloaded <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a>,
+then click on the <em>Import/Export Data</em> menu and select <em>Import Data from -> Text File</em>.
+Specify a location, select <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a>
+and click on the <em>Open</em> button. Answer <em>Yes</em> in the dialog box that
+pops up (which asks if you wish to paste the selected data).
+
+Alternately, you can copy/paste directly. Select and copy the data in a separate window. Position your
+cursor at (0,0) in your table, and select <em>Paste</em> from the <em>Table</em> menu.
+
+The values will be entered into the spreadsheet.
+<table>
+<tr>
+<td>
+\image html datasetwdata.png
+</td>
+</tr>
+</table>
+</li>
+<li><em>Table -> Close</em> the dataset, and save the data.</li>
+</ul>
+
+\subsection subsec_learn_hv_topics_image Displaying a Dataset as an Image
+Any dataset can be viewed as an image in HDFView. Below are the steps that demonstrate this.
+<ul>
+<li>Right click on <em>Storm</em> in the tree view, and select <em>Open As</em>.</li>
+<li>Select the <em>Image</em> button under <em>Display As</em> (near the top) in the Dataset Selection window that pops
+up. Then click <em>OK</em> at the bottom of the window to display the image.
+<table>
+<tr>
+<td>
+\image html showasimage.png
+</td>
+</tr>
+</table>
+</li>
+<li>The rainbow icon brings you to the Image Palette window. Click on that to play with the palette
+(GrayWave probably is the best choice). Close.</li>
+</ul>
+
+\subsection subsec_learn_hv_topics_attr Creating Attributes
+Additional information to describe an object can be stored in attributes. An attribute can be
+added to a group or dataset with HDFView.
+
+The following illustrates how to add an attribute to the group <em>/Data</em>:
+<ul>
+<li>Click on the <em>/Data</em> folder in the tree view. You will see two tabs, <em>Object Attribute Info</em> and
+<em>General Object Info</em>, in the pane on the right site of the HDFView window.
+<table>
+<tr>
+<td>
+\image html noattrs.png
+</td>
+</tr>
+</table>
+</li>
+<li>With the left mouse button, select the <em>Add Attribute</em> button.</li>
+<li>Select the <em>Add Attribute</em> button to add an attribute with these values:</li>
+<table>
+<tr>
+<th>Name
+</th>
+<td><em>BatchID</em>
+</td>
+</tr>
+<tr>
+<th>Type
+</th>
+<td>INTEGER
+</td>
+</tr>
+<tr>
+<th>Size (bits)
+</th>
+<td>32
+</td>
+</table>
+<li>Select the <em>Ok</em> button. The attribute will show up under the <em>Object Attribute Info</em> tab.</li>
+<li>Double-click the BatchID attribute line to open the data table for BatchID.</li>
+<li>Click in the first cell and enter <em>3343</em> followed by the enter key.</li>
+<li><em>Table -> Close</em>, answer <em>Yes</em> in the dialog box that
+pops up (which asks if you wish to paste the selected data).</li>
+</ul>
+Adding an attribute to a dataset is very similar to adding an attribute to a group. For example,
+the following adds an attribute to the <em>/Storm</em> dataset:
+<ul>
+<li>Left mouse click on the <em>/Storm</em> dataset in the tree view. You will see the <em>Object Attribute
+Info</em> and <em>General Object Info</em> tabs on the right</li>
+<li>In the <em>Object Attribute Info</em> pane select the <em>Add Attribute</em> button and enter an attribute with
+these values. (Be sure to add a <em>String Length</em> or the string will be truncated to one character!):</li>
+<table>
+<tr>
+<th>Name
+</th>
+<td><em>Units</em>
+</td>
+</tr>
+<tr>
+<th>Type
+</th>
+<td>STRING
+</td>
+</tr>
+<tr>
+<th>String Length
+</th>
+<td>3
+</td>
+</table>
+<li>Select the <em>Ok</em> button. The attribute will show up under the <em>Object Attribute Info</em> tab.</li>
+<li>Double-click the Units attribute line to open the data table for Units.</li>
+<li>Click in the first cell and enter <em>m/s</em> followed by the enter key.</li>
+<li><em>Table -> Close</em>, answer <em>Yes</em> in the dialog box that
+pops up (which asks if you wish to paste the selected data).
+<table>
+<tr>
+<td>
+\image html scarletletter.png
+</td>
+</tr>
+</table>
+</li>
+</ul>
+
+\subsection subsec_learn_hv_topics_compress Creating a Compressed and Chunked Dataset
+A chunked and compressed dataset can be created using HDFView. A compressed dataset is a dataset
+whose size has been compressed to take up less space. In order to compress an HDF5 dataset, the
+dataset must be stored with a chunked dataset layout (as multiple <em>chunks</em> that are stored separately
+in the file).
+
+Please note that the chunk sizes used in this topic are for demonstration purposes only. For
+information on chunking and specifying an appropriate chunk size, see the
+<a href="https://confluence.hdfgroup.org/display/HDF5/Chunking+in+HDF5">Chunking in HDF5</a> documentation.
+
+Also see the HDF5 Tutorial topic on \ref secLBComDsetCreate.
+<ul>
+<li>Right click on storm.h5. Select <em>New -> Group</em>.</li>
+<li>Enter <em>Image</em> for the name of the group, and click the <em>OK</em> button to create the group.
+<table>
+<tr>
+<td>
+\image html newgroupimage.png
+</td>
+</tr>
+</table>
+</li>
+<li>Right click on the <em>Image</em> group, and select <em>New -> Dataset</em>.</li>
+<li>Enter the following information for the dataset. Leave the <em>Datatype</em> as is (INTEGER):
+<table>
+<tr>
+<th>Dataset name
+</th>
+<td><em>Another Storm</em>
+</td>
+</tr>
+<tr>
+<th>Under Dataspace, Current size
+</th>
+<td>57x57
+</td>
+</tr>
+<tr>
+<th>Storage Layout
+</th>
+<td>Chunked
+</td>
+</tr>
+<tr>
+<th>Chunk Size
+</th>
+<td>20x20
+</td>
+</tr>
+<tr>
+<th>Compression
+</th>
+<td>gzip
+</td>
+</tr>
+<tr>
+<th>Compression Level
+</th>
+<td>9
+</td>
+</table>
+You will see the <em>Another Storm</em> dataset in the <em>Image</em> group:
+<table>
+<tr>
+<td>
+\image html hdfview-anthrstrm.png
+</td>
+</tr>
+</table>
+</li>
+<li>Double left-mouse click on the <em>Another Storm</em> dataset to display the spreadsheet:
+<table>
+<tr>
+<td>
+\image html hdfview-anthrstrm-sprdsht.png
+</td>
+</tr>
+</table>
+</li>
+<li>Copy the data from the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset. (See the previous topic for copying
+<a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> into a dataset.)</li>
+<li><em>Table -> Close</em>, and save the data.</li>
+<li>Right click on <em>Another Storm</em>, and select <em>Open As</em>.</li>
+<li>Select the <em>Image</em> button in the Dataset Selection window that pops up. Click the <em>Ok</em> button at the
+bottom of the window to view the dataset as an image.
+<table>
+<tr>
+<td>
+\image html hdfview-anthrstrm-img.png
+</td>
+</tr>
+</table>
+</li>
+</ul>
+
+\subsection subsec_learn_hv_topics_subset Creating an Image and a Subset
+A previous topic demonstrated how to view any dataset as an image in HDFView. With HDFView you can also
+create an image to begin with, as is shown below.
+<ul>
+<li>Right click on the <em>Data</em> group and select <em>New -> Image</em>.</li>
+<li>A window pops up on the right. Enter the following and then click <em>Ok</em>:</li>
+<table>
+<tr>
+<th>Image name
+</th>
+<td><em>Storm Image</em>
+</td>
+</tr>
+<tr>
+<th>Height
+</th>
+<td>57
+</td>
+</tr>
+<tr>
+<th>Width
+</th>
+<td>57
+</td>
+</table>
+
+<li>Close the dataset.</li>
+<li>Expand the <em>Data</em> group to see its contents. You will see the <em>Storm Image</em> dataset.
+<table>
+<tr>
+<td>
+\image html hdfview-imgicon.png
+</td>
+</tr>
+</table>
+</li>
+<li>
+Add data to the <em>Storm Image</em> dataset as was shown previously:
+<ul>
+<li>Right click on <em>Storm Image</em>, and select <em>Open As</em> to open the Dataset Selection window.</li>
+<li>Click on the <em>Spreadsheet</em> button at the top left of the Dataset Selection window to view the image
+as a spreadsheet.</li>
+<li>Copy the data from the <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/storm1.txt">storm1.txt</a> file into the dataset.</li>
+<li>Close the dataset and save the data.</li>
+</ul>
+</li>
+<li>Left double click on <em>Storm Image</em> to see the image. Close the dataset.</li>
+<li>Right click on <em>Storm Image</em> and select <em>Open As</em> to bring up the Data Selection window.</li>
+<li>Select a subset by clicking the left mouse on the image in the window and dragging the mouse.
+Notice that the Height and Width values change. Select to display it as an image. Click <em>Ok</em>.
+<table>
+<tr>
+<td>
+\image html hdfview-imgsubset.png
+</td>
+</tr>
+</table>
+</li>
+<li>Position the cursor in the middle of the image. Press Shift+Left Mouse button and hold, and then
+drag the mouse to select another subset.</li>
+<li>Select <em>Image->Write Selection to Image</em>. Enter <em>Subset</em> for the new image name. Click <em>Ok</em>. The <em>Subset</em>
+image will appear in the tree view on the left.</li>
+<li>Left double click on the image <em>Subset</em> to bring it up on the right.
+<table>
+<tr>
+<td>
+\image html hdfview-newimgsubset.png
+</td>
+</tr>
+</table>
+</li>
+<li>Close the <em>Subset</em> image.</li>
+</ul>
+
+\subsection subsec_learn_hv_topics_table Creating a Table (Compound Dataset)
+A dataset with a compound datatype contains data elements that consist of multiple fields. If the
+dataspace for the compound dataset is one-dimensional, then the dataset can be viewed as a table in
+HDFView, as is shown below.
+<ul>
+<li>Right button click on the group <em>Data</em>. Select <em>New -> Compound DS</em>.</li>
+<li>A window pops up. Only fill in the following fields:
+<table>
+<tr>
+<th>Dataset name
+</th>
+<td>Table
+</td>
+</tr>
+<tr>
+<th>Dataspace (Current size only)
+</th>
+<td>4
+</td>
+</tr>
+<tr>
+<th>Compound Datatype Properties:
+<br />Number of Members
+</th>
+<td>3
+</td>
+</tr>
+<tr>
+<th>Compound Datatype Properties:
+<br /><em>Name</em> / Datatype / Size
+</th>
+<td><em>Description</em> / string / 4
+<br /><em>Temperature</em> / float / 1
+<br /><em>Pressure</em> / double / 1
+</td>
+</tr>
+</table>
+
+<table>
+<tr>
+<td>
+\image html hdfview-newcmpd.png
+</td>
+</tr>
+</table>
+</li>
+<li>Click Ok at the bottom.</li>
+<li>Open the Data group (if it is not open) and double left click on the Table object.
+<table>
+<tr>
+<td>
+\image html hdfview-table.png
+</td>
+</tr>
+</table>
+</li>
+<li>Close the dataset.</li>
+</ul>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted
+
+*/
diff --git a/doxygen/dox/ReferenceManual.dox b/doxygen/dox/ReferenceManual.dox
index df0c747..7900925 100644
--- a/doxygen/dox/ReferenceManual.dox
+++ b/doxygen/dox/ReferenceManual.dox
@@ -1,53 +1,32 @@
/** \page RM HDF5 Reference Manual
-The functions provided by the HDF5 C-API are grouped into the following
+The functions provided by the HDF5 API are grouped into the following
\Emph{modules}:
<table>
<tr><th>Modules</th></tr>
<tr valign="top">
<td>
-
<table>
<tr valign="top"><td style="border: none;">
-\li \ref H5A "Attributes (H5A)"
-\li \ref H5D "Datasets (H5D)"
-\li \ref H5S "Dataspaces (H5S)"
-\li \ref H5T "Datatypes (H5T)"
-\li \ref H5E "Error Handling (H5E)"
-\li \ref H5ES "Event Sets (H5ES)"
-\li \ref H5F "Files (H5F)"
-\li \ref H5Z "Filters (H5Z)"
-\li \ref H5G "Groups (H5G)"
-</td><td style="border: none;">
-\li \ref H5I "Identifiers (H5I)"
-\li \ref H5 "Library General (H5)"
-\li \ref H5L "Links (H5L)"
-\li \ref H5M "Maps (H5M)"
-\li \ref H5O "Objects (H5O)"
-\li \ref H5P "Property Lists (H5P)"
-\li \ref H5PL "Dynamically-loaded Plugins (H5PL)"
-\li \ref H5R "References (H5R)"
-\li \ref H5VL "Virtual Object Layer (H5VL)"
-</td><td style="border: none;">
-\li \ref high_level
- <ul>
- <li>\ref H5LT "Lite (H5LT, H5LD)"
- <li>\ref H5IM "Images (H5IM)"
- <li>\ref H5TB "Table (H5TB)"
- <li>\ref H5PT "Packet Table (H5PT)"
- <li>\ref H5DS "Dimension Scale (H5DS)"
- <li>\ref H5DO "Optimizations (H5DO)"
- <li>\ref H5LR "Extensions (H5LR, H5LT)"
- </ul>
-</td></tr>
-<tr><td colspan="3" style="border: none;">
-\a Core \a library: \ref H5 \ref H5A \ref H5D \ref H5E \ref H5ES \ref H5F \ref H5G \ref H5I \ref H5L
-\ref H5M \ref H5O \ref H5P \ref H5PL \ref H5R \ref H5S \ref H5T \ref H5VL \ref H5Z
-</td></tr>
-<tr><td colspan="3" style="border: none;">
-\a High-level \a library: \ref H5LT \ref H5IM \ref H5TB \ref H5PT \ref H5DS \ref H5DO \ref H5LR
-</td></tr>
+\include{doc} core_menu.md
+</td>
+</tr>
+<tr valign="top"><td style="border: none;">
+<!-- High-level library -->
+\include{doc} high_level_menu.md
+</td>
+</tr>
+<tr valign="top"><td style="border: none;">
+<!-- Fortran library -->
+\include{doc} fortran_menu.md
+</td>
+</tr>
+<tr valign="top"><td style="border: none;">
+<!-- Java library -->
+\include{doc} java_menu.md
+</td>
+</tr>
<tr>
<td><a href="./deprecated.html">Deprecated functions</a></td>
<td>Functions with \ref ASYNC</td>
diff --git a/doxygen/dox/Specifications.dox b/doxygen/dox/Specifications.dox
index 5a36d61..e352f40 100644
--- a/doxygen/dox/Specifications.dox
+++ b/doxygen/dox/Specifications.dox
@@ -2,20 +2,20 @@
\section DDL
-\li \ref DDLBNF110 "DDL in BNF through HDF5 1.10"
-\li \ref DDLBNF112 "DDL in BNF for HDF5 1.12 and above"
+\li \ref DDLBNF110
+\li \ref DDLBNF112
\section File Format
-\li \ref FMT1 "HDF5 File Format Specification Version 1.0"
-\li \ref FMT11 "HDF5 File Format Specification Version 1.1"
-\li \ref FMT2 "HDF5 File Format Specification Version 2.0"
-\li \ref FMT3 "HDF5 File Format Specification Version 3.0"
+\li \ref FMT1
+\li \ref FMT11
+\li \ref FMT2
+\li \ref FMT3
\section Other
-\li \ref IMG "HDF5 Image and Palette Specification Version 1.2"
-\li \ref TBL "HDF5 Table Specification Version 1.0"
+\li \ref IMG
+\li \ref TBL
\li <a href="https://support.hdfgroup.org/HDF5/doc/HL/H5DS_Spec.pdf">
HDF5 Dimension Scale Specification</a>
diff --git a/doxygen/dox/TechnicalNotes.dox b/doxygen/dox/TechnicalNotes.dox
index 9bd2802..bca81e4 100644
--- a/doxygen/dox/TechnicalNotes.dox
+++ b/doxygen/dox/TechnicalNotes.dox
@@ -1,13 +1,13 @@
/** \page TN Technical Notes
-\li \link api-compat-macros API Compatibility Macros \endlink
-\li \ref APPDBG "Debugging HDF5 Applications"
-\li \ref FMTDISC "File Format Walkthrough"
-\li \ref FILTER "Filters"
-\li \ref IOFLOW "HDF5 Raw I/O Flow Notes"
-\li \ref TNMDC "Metadata Caching in HDF5"
-\li \ref MT "Thread Safe library"
-\li \ref VFL "Virtual File Layer"
+\li \ref api-compat-macros
+\li \ref APPDBG
+\li \ref FMTDISC
+\li \ref FILTER
+\li \ref IOFLOW
+\li \ref TNMDC
+\li \ref MT
+\li \ref VFL
*/
diff --git a/doxygen/dox/UsersGuide.dox b/doxygen/dox/UsersGuide.dox
new file mode 100644
index 0000000..dbb6053
--- /dev/null
+++ b/doxygen/dox/UsersGuide.dox
@@ -0,0 +1,403 @@
+/** \page UG HDF5 User Guide
+
+<center>
+HDF5 Release 1.14
+
+\image html HDFG-logo.png "The HDF Group"
+
+</center>
+
+\ref sec_data_model
+\li \ref subsec_data_model_intro
+\li \ref subsec_data_model_abstract
+ <ul>
+ <li> \ref subsubsec_data_model_abstract_file
+ <li> \ref subsubsec_data_model_abstract_group
+ <li> \ref subsubsec_data_model_abstract_dataset
+ <li> \ref subsubsec_data_model_abstract_space
+ <li> \ref subsubsec_data_model_abstract_type
+ <li> \ref subsubsec_data_model_abstract_attr
+ <li> \ref subsubsec_data_model_abstract_plist
+ <li> \ref subsubsec_data_model_abstract_link
+ </ul>
+\li \ref subsec_data_model_storage
+ <ul>
+ <li> \ref subsubsec_data_model_storage_spec
+ <li> \ref subsubsec_data_model_storage_imple
+ </ul>
+\li \ref subsec_data_model_structure
+ <ul>
+ <li> \ref subsubsec_data_model_structure_file
+ <li> \ref subsubsec_data_model_structure_path
+ <li> \ref subsubsec_data_model_structure_example
+ </ul>
+
+\ref sec_program
+\li \ref subsec_program_intro
+\li \ref subsec_program_model
+ <ul>
+ <li> \ref subsubsec_program_model_create
+ <li> \ref subsubsec_program_model_dset
+ <li> \ref subsubsec_program_model_close
+ <li> \ref subsubsec_program_model_data
+ <li> \ref subsubsec_program_model_partial
+ <li> \ref subsubsec_program_model_info
+ <li> \ref subsubsec_program_model_compound
+ <li> \ref subsubsec_program_model_extend
+ <li> \ref subsubsec_program_model_group
+ <li> \ref subsubsec_program_model_attr
+ </ul>
+\li \ref subsec_program_transfer_pipeline
+
+\ref sec_file
+\li \ref subsec_file_intro
+\li \ref subsec_file_access_modes
+\li \ref subsec_file_creation_access
+\li \ref subsec_file_drivers
+\li \ref subsec_file_program_model
+ <ul>
+ <li> \ref subsubsec_file_program_model_create
+ <li> \ref subsubsec_file_program_model_open
+ <li> \ref subsubsec_file_program_model_close
+ </ul>
+\li \ref subsec_file_h5dump
+\li \ref subsec_file_summary
+\li \ref subsec_file_create
+\li \ref subsec_file_closes
+\li \ref subsec_file_property_lists
+ <ul>
+ <li> \ref subsubsec_file_property_lists_create
+ <li> \ref subsubsec_file_property_lists_props
+ <li> \ref subsubsec_file_property_lists_access
+ </ul>
+\li \ref subsec_file_alternate_drivers
+ <ul>
+ <li> \ref subsubsec_file_alternate_drivers_id
+ <li> \ref subsubsec_file_alternate_drivers_sec2
+ <li> \ref subsubsec_file_alternate_drivers_direct
+ <li> \ref subsubsec_file_alternate_drivers_log
+ <li> \ref subsubsec_file_alternate_drivers_win
+ <li> \ref subsubsec_file_alternate_drivers_stdio
+ <li> \ref subsubsec_file_alternate_drivers_mem
+ <li> \ref subsubsec_file_alternate_drivers_family
+ <li> \ref subsubsec_file_alternate_drivers_multi
+ <li> \ref subsubsec_file_alternate_drivers_split
+ <li> \ref subsubsec_file_alternate_drivers_par
+ </ul>
+\li \ref subsec_file_examples
+ <ul>
+ <li> \ref subsubsec_file_examples_trunc
+ <li> \ref subsubsec_file_examples_props
+ <li> \ref subsubsec_file_examples_access
+ </ul>
+\li \ref subsec_file_multiple
+
+\ref sec_group
+\li \ref subsec_group_intro
+\li \ref subsec_group_descr
+ <ul>
+ <li> \ref subsubsec_group_descr_object
+ <li> \ref subsubsec_group_descr_model
+ <li> \ref subsubsec_group_descr_path
+ <li> \ref subsubsec_group_descr_impl
+ </ul>
+\li \ref subsec_group_h5dump
+\li \ref subsec_group_function
+\li \ref subsec_group_program
+ <ul>
+ <li> \ref subsubsec_group_program_create
+ <li> \ref subsubsec_group_program_open
+ <li> \ref subsubsec_group_program_dataset
+ <li> \ref subsubsec_group_program_close
+ <li> \ref subsubsec_group_program_links
+ <li> \ref subsubsec_group_program_info
+ <li> \ref subsubsec_group_program_objs
+ <li> \ref subsubsec_group_program_all
+ </ul>
+\li \ref subsec_group_examples
+
+\ref sec_dataset
+\li \ref subsec_dataset_intro
+\li \ref subsec_dataset_function
+\li \ref subsec_dataset_program
+ <ul>
+ <li> \ref subsubsec_dataset_program_general
+ <li> \ref subsubsec_dataset_program_create
+ <li> \ref subsubsec_dataset_program_transfer
+ <li> \ref subsubsec_dataset_program_read
+ </ul>
+\li \ref subsec_dataset_transfer Data Transfer
+ <ul>
+ <li> \ref subsubsec_dataset_transfer_pipe
+ <li> \ref subsubsec_dataset_transfer_filter
+ <li> \ref subsubsec_dataset_transfer_drive
+ <li> \ref subsubsec_dataset_transfer_props
+ <li> \ref subsubsec_dataset_transfer_store
+ <li> \ref subsubsec_dataset_transfer_partial
+ </ul>
+\li \ref subsec_dataset_allocation
+ <ul>
+ <li> \ref subsubsec_dataset_allocation_store
+ <li> \ref subsubsec_dataset_allocation_delete
+ <li> \ref subsubsec_dataset_allocation_release
+ <li> \ref subsubsec_dataset_allocation_ext
+ </ul>
+\li \ref subsec_dataset_filters
+ <ul>
+ <li> \ref subsubsec_dataset_filters_nbit
+ <li> \ref subsubsec_dataset_filters_scale
+ <li> \ref subsubsec_dataset_filters_szip
+ </ul>
+
+\ref sec_datatype
+\li \ref subsec_datatype_intro
+\li \ref subsec_datatype_model
+ <ul>
+ <li> \ref subsubsec_datatype_model_class
+ <li> \ref subsubsec_datatype_model_predefine
+ </ul>
+\li \ref subsec_datatype_usage
+ <ul>
+ <li> \ref subsubsec_datatype_usage_object
+ <li> \ref subsubsec_datatype_usage_create
+ <li> \ref subsubsec_datatype_usage_transfer
+ <li> \ref subsubsec_datatype_usage_discover
+ <li> \ref subsubsec_datatype_usage_user
+ </ul>
+\li \ref subsec_datatype_function
+\li \ref subsec_datatype_program
+ <ul>
+ <li> \ref subsubsec_datatype_program_discover
+ <li> \ref subsubsec_datatype_program_define
+ </ul>
+\li \ref subsec_datatype_other
+ <ul>
+ <li> \ref subsubsec_datatype_other_strings
+ <li> \ref subsubsec_datatype_other_refs
+ <li> \ref subsubsec_datatype_other_enum
+ <li> \ref subsubsec_datatype_other_opaque
+ <li> \ref subsubsec_datatype_other_bitfield
+ </ul>
+\li \ref subsec_datatype_fill
+\li \ref subsec_datatype_complex
+ <ul>
+ <li> \ref subsubsec_datatype_complex_create
+ <li> \ref subsubsec_datatype_complex_analyze
+ </ul>
+\li \ref subsec_datatype_life
+\li \ref subsec_datatype_transfer
+\li \ref subsec_datatype_text
+
+\ref sec_dataspace
+\li \ref subsec_dataspace_intro
+\li \ref subsec_dataspace_function
+\li \ref subsec_dataspace_program
+ <ul>
+ <li> \ref subsubsec_dataspace_program_object
+ <li> \ref subsubsec_dataspace_program_model
+ </ul>
+\li \ref subsec_dataspace_transfer
+ <ul>
+ <li> \ref subsubsec_dataspace_transfer_select
+ <li> \ref subsubsec_dataspace_transfer_model
+ </ul>
+\li \ref subsec_dataspace_select
+\li \ref subsec_dataspace_refer
+ <ul>
+ <li> \ref subsubsec_dataspace_refer_use
+ <li> \ref subsubsec_dataspace_refer_create
+ <li> \ref subsubsec_dataspace_refer_read
+ </ul>
+\li \ref subsec_dataspace_sample
+
+\ref sec_attribute
+\li \ref subsec_attribute_intro
+\li \ref subsec_attribute_program
+ <ul>
+ <li> <!-- \subsubsection subsubsec_attribute_program_exist --> To Open and Read or Write an Existing Attribute </li>
+ </ul>
+\li \ref subsec_error_H5A
+\li \ref subsec_attribute_work
+ <ul>
+ <li> \ref subsubsec_attribute_work_struct
+ <li> \ref subsubsec_attribute_work_create
+ <li> \ref subsubsec_attribute_work_access
+ <li> \ref subsubsec_attribute_work_info
+ <li> \ref subsubsec_attribute_work_iterate
+ <li> \ref subsubsec_attribute_work_delete
+ <li> \ref subsubsec_attribute_work_close
+ </ul>
+\li \ref subsec_attribute_special
+
+\ref sec_error
+\li \ref subsec_error_intro
+\li \ref subsec_error_program
+\li \ref subsec_error_H5E
+\li \ref subsec_error_ops
+ <ul>
+ <li> \ref subsubsec_error_ops_stack
+ <li> \ref subsubsec_error_ops_print
+ <li> \ref subsubsec_error_ops_mute
+ <li> \ref subsubsec_error_ops_custom_print
+ <li> \ref subsubsec_error_ops_walk
+ <li> \ref subsubsec_error_ops_travers
+ </ul>
+\li \ref subsec_error_adv
+ <ul>
+ <li> \ref subsubsec_error_adv_more
+ <li> \ref subsubsec_error_adv_app
+ </ul>
+
+\ref sec_plist
+\li \ref subsec_plist_intro
+\li \ref subsec_plist_class
+ <ul>
+ <li> \ref subsubsec_plist_class
+ <li> \ref subsubsec_plist_lists
+ <li> \ref subsubsec_plist_props
+ </ul>
+\li \ref subsec_plist_program
+ <ul>
+ <li> \ref subsubsec_plist_default
+ <li> \ref subsubsec_plist_basic
+ <li> \ref subsubsec_plist_additional
+ </ul>
+\li \ref subsec_plist_generic
+\li \ref subsec_plist_H5P
+\li \ref subsec_plist_resources
+\li \ref subsec_plist_notes
+
+\ref sec_vol
+\li \ref subsec_vol_intro
+\li \ref subsec_vol_abstract_layer
+\li \ref subsec_vol_connect
+\li \ref subsec_vol_use
+
+\ref sec_async
+\li \ref subsec_async_intro
+
+\ref sec_map
+
+\ref sec_addition
+
+\page AR_UG Additional Resources
+
+\section sec_addition Additional Resources
+These documents provide additional information for the use and tuning of specific HDF5 features.
+ <table style=" border-spacing:0; padding-left:6.00pt; padding-top:6.00pt; padding-right:6.00pt; padding-bottom:6.00pt; float:aligncenter; width:100%; max-width:432.00pt;" cellspacing="0">
+ <caption x-list-start="1" style="font-size: 12.0pt;">Table of Additional resources</caption>
+ <tr style="height: 23.00pt;">
+ <th style="width: 234.000pt; border-top-style: solid; border-top-width: 1px; border-top-color: #228a22; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align : top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Document</p>
+</th>
+ <th style="width: 198.000pt; border-top-style: solid; border-top-width: 1px; border-top-color: #228a22; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align : top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Comments</p>
+</th>
+</tr>
+ <tr style="height: 23.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span>@ref HDF5Examples</span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Code examples by API. </p>
+</td>
+</tr>
+ <tr style="height: 36.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/Chunking/index.html">Chunking in HDF5</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Structuring the use of chunking and tuning it for performance.</p>
+</td>
+</tr>
+ <tr style="height: 36.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span class="FM_LT_LinkText"><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/DirectChunkWrite/UsingDirectChunkWrite.pdf">Using the Direct Chunk Write Function</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes another way that chunks can be written to datasets.</p>
+</td>
+</tr>
+ <tr style="height: 88.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy.pdf">Copying Committed Datatypes with H5Ocopy</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes how to copy to another file a dataset that uses a committed datatype or an object with an attribute that uses a committed datatype so that the committed datatype in the destination file can be used by multiple objects.</p>
+</td>
+</tr>
+ <tr style="height: 36.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/MetadataCache/index.html">Metadata Caching in HDF5</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Managing the HDF5 metadata cache and tuning it for performance.</p>
+</td>
+</tr>
+ <tr style="height: 49.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/DynamicallyLoadedFilters/HDF5DynamicallyLoadedFilters.pdf">HDF5 Dynamically Loaded Filters</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes how an HDF5 application can apply a filter that is not registered with the HDF5 Library.</p>
+</td>
+</tr>
+ <tr style="height: 62.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/FileImageOperations/HDF5FileImageOperations.pdf">HDF5 File Image Operations</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes how to work with HDF5 files in memory. Disk I/O is not required when file images are opened, created, read from, or written to.</p>
+</td>
+</tr>
+ <tr style="height: 62.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">Modified Region Writes</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes how to set write operations for in-memory files so that only modified regions are written to storage. Available when the Core (Memory) VFD is used.</p>
+</td>
+</tr>
+ <tr style="height: 36.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/UsingIdentifiers/index.html">Using Identifiers</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes how identifiers behave and how they should be treated.</p>
+</td>
+</tr>
+ <tr style="height: 36.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/UsingUnicode/index.html">Using UTF-8 Encoding in HDF5 Applications</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes the use of UTF-8 Unicode character encodings in HDF5 applications.</p>
+</td>
+</tr>
+ <tr style="height: 49.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.pdf">Freeing Memory Allocated by the HDF5 Library</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>Describes how inconsistent memory management can cause heap corruption or resource leaks and possible solutions.</p>
+</td>
+</tr>
+ <tr style="height: 23.00pt;">
+ <td style="width: 234.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p style="font-style: italic; color: #0000ff;"><span><a href="http://www.hdfgroup.org/HDF5/doc/Glossary.html">HDF5 Glossary</a></span></p>
+</td>
+ <td style="width: 198.000pt; border-bottom-style: solid; border-bottom-width: 1px; border-bottom-color: #228a22; vertical-align: top;padding-left: 6.00pt; padding-top: 3.00pt; padding-right: 6.00pt; padding-bottom: 3.00pt;">
+ <p>A glossary of terms.</p>
+</td>
+</tr>
+ </table>
+
+Previous Chapter \ref sec_plist
+
+\par Don't like what you see? - You can help to improve this User Guide
+ Complete the survey linked near the top of this page!\n
+ We treat documentation like code: Fork the
+ <a href="https://github.com/HDFGroup/hdf5">HDF5 repo</a>, make changes, and create a
+ <a href="https://github.com/HDFGroup/hdf5/pulls">pull request</a> !\n
+
+*/ \ No newline at end of file
diff --git a/doxygen/dox/ViewTools.dox b/doxygen/dox/ViewTools.dox
new file mode 100644
index 0000000..0b685a0
--- /dev/null
+++ b/doxygen/dox/ViewTools.dox
@@ -0,0 +1,1198 @@
+/** @page ViewTools Tools for Viewing and Editing HDF5 Files
+
+Navigate back: \ref index "Main" / \ref GettingStarted
+<hr>
+
+\section secToolsBasic Basic Facts about HDF5
+The following are basic facts about HDF5 files to keep in mind while completing these tutorial topics:
+\li All HDF5 files contain a root group "/".
+\li There are two primary objects in HDF5, a group and a dataset:<br />
+ Groups allow objects to be organized into a group structure, such as a tree.<br />
+ Datasets contain raw data values.
+\li Additional information about an HDF5 object may optionally be stored in attributes attached to the object.
+
+\section secToolsTopics Tutorial Topics
+<table>
+<tr>
+<th>Tutorial Topic</th>
+<th>Description</th>
+</tr>
+<tr>
+<td>
+@ref LearnHDFView
+</td>
+<td>Use HDFView to create, edit and view files.
+</td>
+</tr>
+<tr>
+<td>
+@ref ViewToolsCommand
+</td>
+<td>Use the HDF5 command-line tools for viewing, editing, and comparing HDF5 files.
+</td>
+</tr>
+<tr>
+<td>@ref ViewToolsJPSS
+</td>
+<td>Use HDF5 tools to examine and work with JPSS NPP files.
+</td>
+</tr>
+</table>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted
+
+@page ViewToolsCommand Command-line Tools
+Navigate back: \ref index "Main" / \ref GettingStarted
+<hr>
+
+\section secViewToolsCommandObtain Obtain Tools and Files (Optional)
+Pre-built binaries for Linux and Windows are distributed within the respective HDF5 binary release
+packages, which can be obtained from the <a href="https://portal.hdfgroup.org/display/support/Download+HDF5">Download HDF5</a> page.
+
+HDF5 files can be obtained from various places such as \ref HDF5Examples and <a href="http://www.hdfeos.org/">HDF-EOS and Tools and
+Information Center</a>. Specifically, the following examples are used in this tutorial topic:
+\li HDF5 Files created from compiling the \ref LBExamples
+\li HDF5 Files on the <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a> page
+\li NPP JPSS files, <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5.gz">SVM01_npp.. (gzipped)</a>
+and <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5.gz">SVM09_npp.. (gzipped)</a>
+\li HDF-EOS <a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/OMI-Aura.he5">OMI-Aura file</a>
+
+\section secViewToolsCommandTutor Tutorial Topics
+A variety of command-line tools are included in the HDF5 binary distribution. There are tools to view,
+edit, convert and compare HDF5 files. This tutorial discusses the tools by their functionality. It
+does not cover all of the HDF5 tools.
+
+<table>
+<tr>
+<th>Tool Category</th>
+<th>Topic</th>
+<th>Tools Used</th>
+</tr>
+<tr>
+<td><strong>@ref ViewToolsView</strong></td>
+<td>@ref secViewToolsViewContent</td>
+<td>h5dump and h5ls
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsViewDset</td>
+<td>h5dump and h5ls
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsViewGrps</td>
+<td>h5dump and h5ls
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsViewAttr</td>
+<td>h5dump
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsViewSub</td>
+<td>h5dump
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsViewDtypes</td>
+<td>h5dump
+</td>
+</tr>
+<tr>
+<td>@ref ViewToolsEdit</td>
+<td>@ref secViewToolsEditRemove</td>
+<td>h5repack
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsEditChange</td>
+<td>h5repack
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsEditApply</td>
+<td>h5repack
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsEditCopy</td>
+<td>h5copy
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsEditAdd</td>
+<td>h5jam and h5unjam
+</td>
+</tr>
+<tr>
+<td>@ref ViewToolsConvert</td>
+<td>@ref secViewToolsConvertASCII</td>
+<td>h5dump
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsConvertBinary</a></td>
+<td>h5dump
+</td>
+</tr>
+<tr>
+<td></td>
+<td>@ref secViewToolsConvertExport</td>
+<td>h5dump and h5import
+</td>
+</tr>
+</table>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted
+
+@page ViewToolsView Command-line Tools For Viewing HDF5 Files
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+<hr>
+
+\section secViewToolsViewTOC Contents
+<ul>
+<li>\ref secViewToolsViewContent</li>
+<li>\ref secViewToolsViewDset</li>
+<li>\ref secViewToolsViewGrps</li>
+<li>\ref secViewToolsViewAttr</li>
+<li>\ref secViewToolsViewSub</li>
+<li>\ref secViewToolsViewDtypes</li>
+</ul>
+
+\section secViewToolsViewContent File Content and Structure
+The h5dump and h5ls tools can both be used to view the contents of an HDF5 file. The tools are discussed below:
+<ul>
+<li>\ref subsecViewToolsViewContent_h5dump</li>
+<li>\ref subsecViewToolsViewContent_h5ls</li>
+</ul>
+
+\subsection subsecViewToolsViewContent_h5dump h5dump
+The h5dump tool dumps or displays the contents of an HDF5 file (textually). By default if you specify no options,
+h5dump will display the entire contents of a file. There are many h5dump options for examining specific details
+of a file. To see all of the available h5dump options, specify the <code style="background-color:whitesmoke;">-h</code>
+or <code style="background-color:whitesmoke;">--help</code> option:
+\code
+h5dump -h
+\endcode
+
+The following h5dump options can be helpful in viewing the content and structure of a file:
+<table>
+<tr>
+<th>Option</th>
+<th>Description</th>
+<th>Comment</th>
+</tr>
+<tr>
+<td>-n, --contents
+</td>
+<td>Displays a list of the objects in a file
+</td>
+<td>See @ref subsubsecViewToolsViewContent_h5dumpEx1
+</td>
+</tr>
+<tr>
+<td>-n 1, --contents=1
+</td>
+<td>Displays a list of the objects and attributes in a file
+</td>
+<td>See @ref subsubsecViewToolsViewAttr_h5dumpEx6
+</td>
+</tr>
+<tr>
+<td>-H, --header
+</td>
+<td>Displays header information only (no data)
+</td>
+<td>See @ref subsubsecViewToolsViewContent_h5dumpEx2
+</td>
+</tr>
+<tr>
+<td>-A 0, --onlyattr=0
+</td>
+<td>Suppresses the display of attributes
+</td>
+<td>See @ref subsubsecViewToolsViewContent_h5dumpEx2
+</td>
+</tr>
+<tr>
+<td>-N P, --any_path=P
+</td>
+<td>Displays any object or attribute that matches path P
+</td>
+<td>See @ref subsubsecViewToolsViewAttr_h5dumpEx6
+</td>
+</tr>
+</table>
+
+\subsubsection subsubsecViewToolsViewContent_h5dumpEx1 Example 1
+The following command displays a list of the objects in the file OMI-Aura.he5 (an HDF-EOS5 file):
+\code
+h5dump -n OMI-Aura.he5
+\endcode
+
+As shown in the output below, the objects (groups, datasets) are listed to the left, followed by their
+names. You can see that this file contains two root groups, HDFEOS and HDFEOS INFORMATION:
+\code
+HDF5 "OMI-Aura.he5" {
+FILE_CONTENTS {
+ group /
+ group /HDFEOS
+ group /HDFEOS/ADDITIONAL
+ group /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES
+ group /HDFEOS/GRIDS
+ group /HDFEOS/GRIDS/OMI Column Amount O3
+ group /HDFEOS/GRIDS/OMI Column Amount O3/Data Fields
+ dataset /HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/ColumnAmountO3
+ dataset /HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/RadiativeCloudFraction
+ dataset /HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle
+ dataset /HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/ViewingZenithAngle
+ group /HDFEOS INFORMATION
+ dataset /HDFEOS INFORMATION/StructMetadata.0
+ }
+}
+\endcode
+
+\subsubsection subsubsecViewToolsViewContent_h5dumpEx2 Example 2
+The file structure of the OMI-Aura.he5 file can be seen with the following command. The -A 0 option suppresses the display of attributes:
+\code
+h5dump -H -A 0 OMI-Aura.he5
+\endcode
+
+Output of this command is shown below:
+\code
+HDF5 "OMI-Aura.he5" {
+GROUP "/" {
+ GROUP "HDFEOS" {
+ GROUP "ADDITIONAL" {
+ GROUP "FILE_ATTRIBUTES" {
+ }
+ }
+ GROUP "GRIDS" {
+ GROUP "OMI Column Amount O3" {
+ GROUP "Data Fields" {
+ DATASET "ColumnAmountO3" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ DATASET "RadiativeCloudFraction" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ DATASET "SolarZenithAngle" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ DATASET "ViewingZenithAngle" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ }
+ }
+ }
+ }
+ GROUP "HDFEOS INFORMATION" {
+ DATASET "StructMetadata.0" {
+ DATATYPE H5T_STRING {
+ STRSIZE 32000;
+ STRPAD H5T_STR_NULLTERM;
+ CSET H5T_CSET_ASCII;
+ CTYPE H5T_C_S1;
+ }
+ DATASPACE SCALAR
+ }
+ }
+}
+}
+\endcode
+
+\subsection subsecViewToolsViewContent_h5ls h5ls
+The h5ls tool by default just displays the objects in the root group. It will not display
+items in groups beneath the root group unless specified. Useful h5ls options for viewing
+file content and structure are:
+<table>
+<tr>
+<th>Option</th>
+<th>Description</th>
+<th>Comment</th>
+</tr>
+<tr>
+<td>-r
+</td>
+<td>Lists all groups and objects recursively
+</td>
+<td>See @ref subsubsecViewToolsViewContent_h5lsEx3
+</td>
+</tr>
+<tr>
+<td>-v
+</td>
+<td>Generates verbose output (lists dataset properties, attributes
+and attribute values, but no dataset values)
+</td>
+<td>
+</td>
+</tr>
+</table>
+
+\subsubsection subsubsecViewToolsViewContent_h5lsEx3 Example 3
+The following command shows the contents of the HDF-EOS5 file OMI-Aura.he5. The output is similar to h5dump, except that h5ls also shows dataspace information for each dataset:
+\code
+h5ls -r OMI-Aura.he5
+\endcode
+
+The output is shown below:
+\code
+/ Group
+/HDFEOS Group
+/HDFEOS/ADDITIONAL Group
+/HDFEOS/ADDITIONAL/FILE_ATTRIBUTES Group
+/HDFEOS/GRIDS Group
+/HDFEOS/GRIDS/OMI\ Column\ Amount\ O3 Group
+/HDFEOS/GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields Group
+/HDFEOS/GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/ColumnAmountO3 Dataset {720, 1440}
+/HDFEOS/GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/RadiativeCloudFraction Dataset {720, 1440}
+/HDFEOS/GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/SolarZenithAngle Dataset {720, 1440}
+/HDFEOS/GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/ViewingZenithAngle Dataset {720, 1440}
+/HDFEOS\ INFORMATION Group
+/HDFEOS\ INFORMATION/StructMetadata.0 Dataset {SCALAR}
+\endcode
+
+\section secViewToolsViewDset Datasets and Dataset Properties
+Both h5dump and h5ls can be used to view specific datasets.
+<ul>
+<li>\ref subsecViewToolsViewDset_h5dump</li>
+<li>\ref subsecViewToolsViewDset_h5ls</li>
+</ul>
+
+\subsection subsecViewToolsViewDset_h5dump h5dump
+Useful h5dump options for examining specific datasets include:
+<table>
+<tr>
+<th>Option</th>
+<th>Description</th>
+<th>Comment</th>
+</tr>
+<tr>
+<td>-d D, --dataset=D
+</td>
+<td>Displays dataset D
+</td>
+<td>See @ref subsubsecViewToolsViewDset_h5dumpEx4
+</td>
+</tr>
+<tr>
+<td> -H, --header
+</td>
+<td>Displays header information only
+</td>
+<td>See @ref subsubsecViewToolsViewDset_h5dumpEx4
+</td>
+</tr>
+<tr>
+<td>-p, --properties
+</td>
+<td>Displays dataset filters, storage layout, and fill value properties
+</td>
+<td>See @ref subsubsecViewToolsViewDset_h5dumpEx5
+</td>
+</tr>
+<tr>
+<td>-A 0, --onlyattr=0
+</td>
+<td>Suppresses the display of attributes
+</td>
+<td>See @ref subsubsecViewToolsViewContent_h5dumpEx2
+</td>
+</tr>
+<tr>
+<td>-N P, --any_path=P
+</td>
+<td>Displays any object or attribute that matches path P
+</td>
+<td>See @ref subsubsecViewToolsViewAttr_h5dumpEx6
+</td>
+</tr>
+</table>
+
+\subsubsection subsubsecViewToolsViewDset_h5dumpEx4 Example 4
+A specific dataset can be viewed with <code style="background-color:whitesmoke;">h5dump</code> using the <code style="background-color:whitesmoke;">-d D</code> option and specifying the entire
+path and name of the dataset for <code style="background-color:whitesmoke;">D</code>. The path is important in identifying the correct dataset,
+as there can be multiple datasets with the same name. The path can be determined by looking at
+the objects in the file with <code style="background-color:whitesmoke;">h5dump -n</code>.
+
+The following example uses the <code style="background-color:whitesmoke;">groups.h5</code> file that is created by the
+\ref LBExamples
+example <code style="background-color:whitesmoke;">h5_crtgrpar.c</code>. To display <code style="background-color:whitesmoke;">dset1</code> in the <code style="background-color:whitesmoke;">groups.h5</code> file below, specify dataset
+<code style="background-color:whitesmoke;">/MyGroup/dset1</code>. The <code style="background-color:whitesmoke;">-H</code> option is used to suppress printing of the data values:
+
+<em>Contents of groups.h5</em>
+\code
+ $ h5dump -n groups.h5
+ HDF5 "groups.h5" {
+ FILE_CONTENTS {
+ group /
+ group /MyGroup
+ group /MyGroup/Group_A
+ dataset /MyGroup/Group_A/dset2
+ group /MyGroup/Group_B
+ dataset /MyGroup/dset1
+ }
+ }
+\endcode
+
+<em>Display dataset "dset1"</em>
+\code
+ $ h5dump -d "/MyGroup/dset1" -H groups.h5
+ HDF5 "groups.h5" {
+ DATASET "/MyGroup/dset1" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 3, 3 ) / ( 3, 3 ) }
+ }
+ }
+\endcode
+
+\subsubsection subsubsecViewToolsViewDset_h5dumpEx5 Example 5
+The <code style="background-color:whitesmoke;">-p</code> option is used to examine the the dataset filters, storage layout, and fill value properties of a dataset.
+
+This option can be useful for checking how well compression works, or even for analyzing performance
+and dataset size issues related to chunking. (The smaller the chunk size, the more chunks that HDF5
+has to keep track of, which increases the size of the file and potentially affects performance.)
+
+In the file shown below the dataset <code style="background-color:whitesmoke;">/DS1</code> is both chunked and compressed:
+\code
+ $ h5dump -H -p -d "/DS1" h5ex_d_gzip.h5
+ HDF5 "h5ex_d_gzip.h5" {
+ DATASET "/DS1" {
+ DATATYPE H5T_STD_I32LE
+ DATASPACE SIMPLE { ( 32, 64 ) / ( 32, 64 ) }
+ STORAGE_LAYOUT {
+ CHUNKED ( 4, 8 )
+ SIZE 5278 (1.552:1 COMPRESSION)
+ }
+ FILTERS {
+ COMPRESSION DEFLATE { LEVEL 9 }
+ }
+ FILLVALUE {
+ FILL_TIME H5D_FILL_TIME_IFSET
+ VALUE 0
+ }
+ ALLOCATION_TIME {
+ H5D_ALLOC_TIME_INCR
+ }
+ }
+ }
+\endcode
+
+You can obtain the <code style="background-color:whitesmoke;">h5ex_d_gzip.c</code> program that created this file, as well as the file created,
+from the <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a> page.
+
+\subsection subsecViewToolsViewDset_h5ls h5ls
+Specific datasets can be specified with <code style="background-color:whitesmoke;">h5ls</code> by simply adding the dataset path and dataset after the
+file name. As an example, this command displays dataset <code style="background-color:whitesmoke;">dset2</code> in the <code style="background-color:whitesmoke;">groups.h5</code>
+file used in @ref subsubsecViewToolsViewDset_h5dumpEx4 :
+\code
+h5ls groups.h5/MyGroup/Group_A/dset2
+\endcode
+
+Just the dataspace information gets displayed:
+\code
+dset2 Dataset {2, 10}
+\endcode
+
+The following options can be used to see detailed information about a dataset.
+<table>
+<tr>
+<th>Option</th>
+<th>Description</th>
+</tr>
+<tr>
+<td>-v, --verbose
+</td>
+<td>Generates verbose output (lists dataset properties, attributes
+and attribute values, but no dataset values)
+</td>
+</tr>
+<tr>
+<td>-d, --data
+</td>
+<td>Displays dataset values
+</td>
+</tr>
+</table>
+
+The output of using <code style="background-color:whitesmoke;">-v</code> is shown below:
+\code
+ $ h5ls -v groups.h5/MyGroup/Group_A/dset2
+ Opened "groups.h5" with sec2 driver.
+ dset2 Dataset {2/2, 10/10}
+ Location: 1:3840
+ Links: 1
+ Storage: 80 logical bytes, 80 allocated bytes, 100.00% utilization
+ Type: 32-bit big-endian integer
+\endcode
+
+The output of using <code style="background-color:whitesmoke;">-d</code> is shown below:
+\code
+ $ h5ls -d groups.h5/MyGroup/Group_A/dset2
+ dset2 Dataset {2, 10}
+ Data:
+ (0,0) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
+\endcode
+
+\section secViewToolsViewGrps Groups
+Both h5dump and h5ls can be used to view specific groups in a file.
+<ul>
+<li>\ref subsecViewToolsViewGrps_h5dump</li>
+<li>\ref subsecViewToolsViewGrps_h5ls</li>
+</ul>
+
+\subsection subsecViewToolsViewGrps_h5dump h5dump
+The <code style="background-color:whitesmoke;">h5dump</code> options that are useful for examining groups are:
+<table>
+<tr>
+<th>Option</th>
+<th>Description</th>
+</tr>
+<tr>
+<td>-g G, --group=G
+</td>
+<td>Displays group G and its members
+</td>
+</tr>
+<tr>
+<td>-H, --header
+</td>
+<td>Displays header information only
+</td>
+</tr>
+<tr>
+<td>-A 0, --onlyattr=0
+</td>
+<td>Suppresses the display of attributes
+</td>
+</tr>
+</table>
+
+To view the contents of the <code style="background-color:whitesmoke;">HDFEOS</code> group in the OMI file mentioned previously, you can specify the path and name of the group as follows:
+\code
+h5dump -g "/HDFEOS" -H -A 0 OMI-Aura.he5
+\endcode
+
+The <code style="background-color:whitesmoke;">-A 0</code> option suppresses attributes and <code style="background-color:whitesmoke;">-H</code> suppresses printing of data values:
+\code
+ HDF5 "OMI-Aura.he5" {
+ GROUP "/HDFEOS" {
+ GROUP "ADDITIONAL" {
+ GROUP "FILE_ATTRIBUTES" {
+ }
+ }
+ GROUP "GRIDS" {
+ GROUP "OMI Column Amount O3" {
+ GROUP "Data Fields" {
+ DATASET "ColumnAmountO3" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ DATASET "RadiativeCloudFraction" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ DATASET "SolarZenithAngle" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ DATASET "ViewingZenithAngle" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ }
+ }
+ }
+ }
+ }
+ }
+\endcode
+
+\subsection subsecViewToolsViewGrps_h5ls h5ls
+You can view the contents of a group with <code style="background-color:whitesmoke;">h5ls</code>/ by specifying the group after the file name.
+To use <code style="background-color:whitesmoke;">h5ls</code> to view the contents of the <code style="background-color:whitesmoke;">/HDFEOS</code> group in the <code style="background-color:whitesmoke;">OMI-Aura.he5</code> file, type:
+\code
+h5ls -r OMI-Aura.he5/HDFEOS
+\endcode
+
+The output of this command is:
+\code
+ /ADDITIONAL Group
+ /ADDITIONAL/FILE_ATTRIBUTES Group
+ /GRIDS Group
+ /GRIDS/OMI\ Column\ Amount\ O3 Group
+ /GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields Group
+ /GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/ColumnAmountO3 Dataset {720, 1440}
+ /GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/RadiativeCloudFraction Dataset {720, 1440}
+ /GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/SolarZenithAngle Dataset {720, 1440}
+ /GRIDS/OMI\ Column\ Amount\ O3/Data\ Fields/ViewingZenithAngle Dataset {720, 1440}
+\endcode
+
+If you specify the <code style="background-color:whitesmoke;">-v</code> option, you can also see the attributes and properties of the datasets.
+
+\section secViewToolsViewAttr Attributes
+
+\subsection subsecViewToolsViewAttr_h5dump h5dump
+Attributes are displayed by default if using <code style="background-color:whitesmoke;">h5dump</code>. Some files contain many attributes, which
+can make it difficult to examine the objects in the file. Shown below are options that can help
+when using <code style="background-color:whitesmoke;">h5dump</code> to work with files that have attributes.
+
+\subsubsection subsubsecViewToolsViewAttr_h5dumpEx6 Example 6
+The <code style="background-color:whitesmoke;">-a</code> A option will display an attribute. However, the path to the attribute must be included
+when specifying this option. For example, to see the <code style="background-color:whitesmoke;">ScaleFactor</code> attribute in the <code style="background-color:whitesmoke;">OMI-Aura.he5</code> file, type:
+\code
+h5dump -a "/HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle/ScaleFactor" OMI-Aura.he5
+\endcode
+
+This command displays:
+\code
+ HDF5 "OMI-Aura.he5" {
+ ATTRIBUTE "ScaleFactor" {
+ DATATYPE H5T_IEEE_F64LE
+ DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
+ DATA {
+ (0): 1
+ }
+ }
+ }
+\endcode
+
+How can you determine the path to the attribute? This can be done by looking at the file contents with the <code style="background-color:whitesmoke;">-n 1</code> option:
+\code
+h5dump -n 1 OMI-Aura.he5
+\endcode
+
+Below is a portion of the output for this command:
+\code
+ HDF5 "OMI-Aura.he5" {
+ FILE_CONTENTS {
+ group /
+ group /HDFEOS
+ group /HDFEOS/ADDITIONAL
+ group /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/EndUTC
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/GranuleDay
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/GranuleDayOfYear
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/GranuleMonth
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/GranuleYear
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/InstrumentName
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/OrbitNumber
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/OrbitPeriod
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/PGEVersion
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/Period
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/ProcessLevel
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/StartUTC
+ attribute /HDFEOS/ADDITIONAL/FILE_ATTRIBUTES/TAI93At0zOfGranule
+
+ ...
+\endcode
+
+There can be multiple objects or attributes with the same name in a file. How can you make sure
+you are finding the correct object or attribute? You can first determine how many attributes
+there are with a specified name, and then examine the paths to them.
+
+The <code style="background-color:whitesmoke;">-N</code> option can be used to display all objects or attributes with a given name.
+For example, there are four attributes with the name <code style="background-color:whitesmoke;">ScaleFactor</code> in the <code style="background-color:whitesmoke;">OMI-Aura.he5</code> file,
+as can be seen below with the <code style="background-color:whitesmoke;">-N</code> option:
+\code
+h5dump -N ScaleFactor OMI-Aura.he5
+\endcode
+
+It outputs:
+\code
+HDF5 "OMI-Aura.he5" {
+ATTRIBUTE "ScaleFactor" {
+ DATATYPE H5T_IEEE_F64LE
+ DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
+ DATA {
+ (0): 1
+ }
+}
+ATTRIBUTE "ScaleFactor" {
+ DATATYPE H5T_IEEE_F64LE
+ DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
+ DATA {
+ (0): 1
+ }
+}
+ATTRIBUTE "ScaleFactor" {
+ DATATYPE H5T_IEEE_F64LE
+ DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
+ DATA {
+ (0): 1
+ }
+}
+ATTRIBUTE "ScaleFactor" {
+ DATATYPE H5T_IEEE_F64LE
+ DATASPACE SIMPLE { ( 1 ) / ( 1 ) }
+ DATA {
+ (0): 1
+ }
+}
+}
+\endcode
+
+\subsection subsecViewToolsViewAttr_h5ls h5ls
+If you include the <code style="background-color:whitesmoke;">-v</code> (verbose) option for <code style="background-color:whitesmoke;">h5ls</code>, you will see all of the attributes for the
+specified file, dataset or group. You cannot display individual attributes.
+
+\section secViewToolsViewSub Dataset Subset
+
+\subsection subsecViewToolsViewSub_h5dump h5dump
+If you have a very large dataset, you may wish to subset or see just a portion of the dataset.
+This can be done with the following <code style="background-color:whitesmoke;">h5dump</code> options.
+<table>
+<tr>
+<th>Option</th>
+<th>Description</th>
+</tr>
+<tr>
+<td>-d D, --dataset=D
+</td>
+<td>Dataset D
+</td>
+</tr>
+<tr>
+<td>-s START, --start=START
+</td>
+<td>Offset or start of subsetting selection
+</td>
+</tr>
+<tr>
+<td>-S STRIDE, --stride=STRIDE
+</td>
+<td>Stride (sampling along a dimension). The default (unspecified, or 1) selects
+every element along a dimension, a value of 2 selects every other element,
+a value of 3 selects every third element, ...
+</td>
+</tr>
+<tr>
+<td>-c COUNT, --count=COUNT
+</td>
+<td>Number of blocks to include in the selection
+</td>
+</tr>
+<tr>
+<td>-k BLOCK, --block=BLOCK
+</td>
+<td>Size of the block in a hyperslab. The default (unspecified, or 1) is for
+the block size to be the size of a single element.
+</td>
+</tr>
+</table>
+
+The <code style="background-color:whitesmoke;">START (s)</code>, <code style="background-color:whitesmoke;">STRIDE (S)</code>, <code style="background-color:whitesmoke;">COUNT (c)</code>, and <code style="background-color:whitesmoke;">BLOCK (k)</code> options
+define the shape and size of the selection. They are arrays with the same number of dimensions as the rank
+of the dataset's dataspace, and they all work together to define the selection. A change to one of
+these arrays can affect the others.
+
+When specifying these h5dump options, a comma is used as the delimiter for each dimension in the
+option value. For example, with a 2-dimensional dataset, the option value is specified as "H,W",
+where H is the height and W is the width. If the offset is 0 for both dimensions, then
+<code style="background-color:whitesmoke;">START</code> would be specified as follows:
+\code
+-s "0,0"
+\endcode
+
+There is also a shorthand way to specify these options with brackets at the end of the dataset name:
+\code
+-d DATASETNAME[s;S;c;k]
+\endcode
+
+Multiple dimensions are separated by commas. For example, a subset for a 2-dimensional dataset would be specified as follows:
+\code
+-d DATASETNAME[s,s;S,S;c,c;k,k]
+\endcode
+
+For a detailed understanding of how selections works, see the #H5Sselect_hyperslab API in the \ref RM.
+
+The dataset SolarZenithAngle in the OMI-Aura.he5 file can be used to illustrate these options. This
+dataset is a 2-dimensional dataset of size 720 (height) x 1440 (width). Too much data will be displayed
+by simply viewing the specified dataset with the <code style="background-color:whitesmoke;">-d</code> option:
+\code
+h5dump -d "HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle" OMI-Aura.he5
+\endcode
+Subsetting narrows down the output that is displayed. In the following example, the first
+15x10 elements (-c "15,10") are specified, beginning with position (0,0) (-s "0,0"):
+\code
+ h5dump -A 0 -d "HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle" -s "0,0" -c "15,10" -w 0 OMI-Aura.he5
+\endcode
+
+If using the shorthand method, specify:
+\code
+ h5dump -A 0 -d "HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle[0,0;;15,10;]" -w 0 OMI-Aura.he5
+\endcode
+
+Where,
+\par The <code style="background-color:whitesmoke;">-d</code> option must be specified
+
+before
+\par subsetting options (if not using the shorthand method).
+
+The <code style="background-color:whitesmoke;">-A 0</code> option suppresses the printing of attributes.
+
+The <code style="background-color:whitesmoke;">-w 0</code> option sets the number of columns of output to the maximum allowed value (65535).
+This ensures that there are enough columns specified for displaying the data.
+
+Either command displays:
+\code
+ HDF5 "OMI-Aura.he5" {
+ DATASET "HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ SUBSET {
+ START ( 0, 0 );
+ STRIDE ( 1, 1 );
+ COUNT ( 15, 10 );
+ BLOCK ( 1, 1 );
+ DATA {
+ (0,0): 79.403, 79.403, 79.403, 79.403, 79.403, 79.403, 79.403, 79.403, 79.403, 79.403,
+ (1,0): 79.071, 79.071, 79.071, 79.071, 79.071, 79.071, 79.071, 79.071, 79.071, 79.071,
+ (2,0): 78.867, 78.867, 78.867, 78.867, 78.867, 78.867, 78.867, 78.867, 78.867, 78.867,
+ (3,0): 78.632, 78.632, 78.632, 78.632, 78.632, 78.632, 78.632, 78.632, 78.632, 78.632,
+ (4,0): 78.429, 78.429, 78.429, 78.429, 78.429, 78.429, 78.429, 78.429, 78.429, 78.429,
+ (5,0): 78.225, 78.225, 78.225, 78.225, 78.225, 78.225, 78.225, 78.225, 78.225, 78.225,
+ (6,0): 78.021, 78.021, 78.021, 78.021, 78.021, 78.021, 78.021, 78.021, 78.021, 78.021,
+ (7,0): 77.715, 77.715, 77.715, 77.715, 77.715, 77.715, 77.715, 77.715, 77.715, 77.715,
+ (8,0): 77.511, 77.511, 77.511, 77.511, 77.511, 77.511, 77.511, 77.511, 77.511, 77.511,
+ (9,0): 77.658, 77.658, 77.658, 77.307, 77.307, 77.307, 77.307, 77.307, 77.307, 77.307,
+ (10,0): 77.556, 77.556, 77.556, 77.556, 77.556, 77.556, 77.556, 77.556, 77.102, 77.102,
+ (11,0): 78.408, 78.408, 78.408, 78.408, 78.408, 78.408, 78.408, 78.408, 77.102, 77.102,
+ (12,0): 76.34, 78.413, 78.413, 78.413, 78.413, 78.413, 78.413, 78.413, 78.413, 78.413,
+ (13,0): 78.107, 78.107, 78.107, 78.107, 78.107, 78.107, 78.107, 78.107, 78.107, 77.195,
+ (14,0): 78.005, 78.005, 78.005, 78.005, 78.005, 78.005, 76.991, 76.991, 76.991, 76.991
+ }
+ }
+ }
+ }
+\endcode
+
+What if we wish to read three rows of three elements at a time (-c "3,3"), where each element
+is a 2 x 3 block (-k "2,3") and we wish to begin reading from the second row (-s "1,0")?
+
+You can do that with the following command:
+\code
+ h5dump -A 0 -d "HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle"
+ -s "1,0" -S "2,3" -c "3,3" -k "2,3" -w 0 OMI-Aura.he5
+\endcode
+
+In this case, the stride must be specified as 2 by 3 (or larger) to accommodate the reading of 2 by 3 blocks.
+If it is smaller, the command will fail with the error,
+\code
+h5dump error: wrong subset selection; blocks overlap.
+\endcode
+
+The output of the above command is shown below:
+\code
+ HDF5 "OMI-Aura.he5" {
+ DATASET "HDFEOS/GRIDS/OMI Column Amount O3/Data Fields/SolarZenithAngle" {
+ DATATYPE H5T_IEEE_F32LE
+ DATASPACE SIMPLE { ( 720, 1440 ) / ( 720, 1440 ) }
+ SUBSET {
+ START ( 1, 0 );
+ STRIDE ( 2, 3 );
+ COUNT ( 3, 3 );
+ BLOCK ( 2, 3 );
+ DATA {
+ (1,0): 79.071, 79.071, 79.071, 79.071, 79.071, 79.071, 79.071, 79.071, 79.071,
+ (2,0): 78.867, 78.867, 78.867, 78.867, 78.867, 78.867, 78.867, 78.867, 78.867,
+ (3,0): 78.632, 78.632, 78.632, 78.632, 78.632, 78.632, 78.632, 78.632, 78.632,
+ (4,0): 78.429, 78.429, 78.429, 78.429, 78.429, 78.429, 78.429, 78.429, 78.429,
+ (5,0): 78.225, 78.225, 78.225, 78.225, 78.225, 78.225, 78.225, 78.225, 78.225,
+ (6,0): 78.021, 78.021, 78.021, 78.021, 78.021, 78.021, 78.021, 78.021, 78.021
+ }
+ }
+ }
+ }
+\endcode
+
+\section secViewToolsViewDtypes Datatypes
+
+\subsection subsecViewToolsViewDtypes_h5dump h5dump
+The following datatypes are discussed, using the output of <code style="background-color:whitesmoke;">h5dump</code> with HDF5 files from the
+<a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a> page:
+<ul>
+<li>@ref subsubsecViewToolsViewDtypes_array</li>
+<li>@ref subsubsecViewToolsViewDtypes_objref</li>
+<li>@ref subsubsecViewToolsViewDtypes_regref</li>
+<li>@ref subsubsecViewToolsViewDtypes_string</li>
+</ul>
+
+\subsubsection subsubsecViewToolsViewDtypes_array Array
+Users have been confused by the difference between an Array datatype (#H5T_ARRAY) and a dataset that
+(has a dataspace that) is an array.
+
+Typically, these users want a dataset that has a simple datatype (like integer or float) that is an
+array, like the following dataset <code style="background-color:whitesmoke;">/DS1</code>. It has a datatype of #H5T_STD_I32LE (32-bit Little-Endian Integer)
+and is a 4 by 7 array:
+\code
+$ h5dump h5ex_d_rdwr.h5
+HDF5 "h5ex_d_rdwr.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_STD_I32LE
+ DATASPACE SIMPLE { ( 4, 7 ) / ( 4, 7 ) }
+ DATA {
+ (0,0): 0, -1, -2, -3, -4, -5, -6,
+ (1,0): 0, 0, 0, 0, 0, 0, 0,
+ (2,0): 0, 1, 2, 3, 4, 5, 6,
+ (3,0): 0, 2, 4, 6, 8, 10, 12
+ }
+ }
+}
+}
+\endcode
+
+Contrast that with the following dataset that has both an Array datatype and is an array:
+\code
+$ h5dump h5ex_t_array.h5
+HDF5 "h5ex_t_array.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_ARRAY { [3][5] H5T_STD_I64LE }
+ DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
+ DATA {
+ (0): [ 0, 0, 0, 0, 0,
+ 0, -1, -2, -3, -4,
+ 0, -2, -4, -6, -8 ],
+ (1): [ 0, 1, 2, 3, 4,
+ 1, 1, 1, 1, 1,
+ 2, 1, 0, -1, -2 ],
+ (2): [ 0, 2, 4, 6, 8,
+ 2, 3, 4, 5, 6,
+ 4, 4, 4, 4, 4 ],
+ (3): [ 0, 3, 6, 9, 12,
+ 3, 5, 7, 9, 11,
+ 6, 7, 8, 9, 10 ]
+ }
+ }
+}
+}
+\endcode
+
+In this file, dataset <code style="background-color:whitesmoke;">/DS1</code> has a datatype of
+\code
+H5T_ARRAY { [3][5] H5T_STD_I64LE }
+\endcode
+and it also has a dataspace of
+\code
+SIMPLE { ( 4 ) / ( 4 ) }
+\endcode
+In other words, it is an array of four elements, in which each element is a 3 by 5 array of #H5T_STD_I64LE.
+
+This dataset is much more complex. Also note that subsetting cannot be done on Array datatypes.
+
+See this <a href="https://portal.hdfgroup.org/display/knowledge/H5T_ARRAY+Datatype">FAQ</a> for more information on the Array datatype.
+
+\subsubsection subsubsecViewToolsViewDtypes_objref Object Reference
+An Object Reference is a reference to an entire object (dataset, group, or named datatype).
+A dataset with an Object Reference datatype consists of one or more Object References.
+An Object Reference dataset can be used as an index to an HDF5 file.
+
+The <code style="background-color:whitesmoke;">/DS1</code> dataset in the following file (<code style="background-color:whitesmoke;">h5ex_t_objref.h5</code>) is an Object Reference dataset.
+It contains two references, one to group <code style="background-color:whitesmoke;">/G1</code> and the other to dataset <code style="background-color:whitesmoke;">/DS2</code>:
+\code
+$ h5dump h5ex_t_objref.h5
+HDF5 "h5ex_t_objref.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_REFERENCE { H5T_STD_REF_OBJECT }
+ DATASPACE SIMPLE { ( 2 ) / ( 2 ) }
+ DATA {
+ (0): GROUP 1400 /G1 , DATASET 800 /DS2
+ }
+ }
+ DATASET "DS2" {
+ DATATYPE H5T_STD_I32LE
+ DATASPACE NULL
+ DATA {
+ }
+ }
+ GROUP "G1" {
+ }
+}
+}
+\endcode
+
+\subsubsection subsubsecViewToolsViewDtypes_regref Region Reference
+A Region Reference is a reference to a selection within a dataset. A selection can be either
+individual elements or a hyperslab. In <code style="background-color:whitesmoke;">h5dump</code> you will see the name of the dataset along with
+the elements or slab that is selected. A dataset with a Region Reference datatype consists of
+one or more Region References.
+
+An example of a Region Reference dataset (<code style="background-color:whitesmoke;">h5ex_t_regref.h5</code>) can be found on the
+<a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a> page,
+under Datatypes. If you examine this dataset with <code style="background-color:whitesmoke;">h5dump</code> you will see that <code style="background-color:whitesmoke;">/DS1</code> is a
+Region Reference dataset as indicated by its datatype, highlighted in bold below:
+\code
+$ h5dump h5ex_t_regref.h5
+HDF5 "h5ex_t_regref.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_REFERENCE { H5T_STD_REF_DSETREG }
+ DATASPACE SIMPLE { ( 2 ) / ( 2 ) }
+ DATA {
+ DATASET /DS2 {(0,1), (2,11), (1,0), (2,4)},
+ DATASET /DS2 {(0,0)-(0,2), (0,11)-(0,13), (2,0)-(2,2), (2,11)-(2,13)}
+ }
+ }
+ DATASET "DS2" {
+ DATATYPE H5T_STD_I8LE
+ DATASPACE SIMPLE { ( 3, 16 ) / ( 3, 16 ) }
+ DATA {
+ (0,0): 84, 104, 101, 32, 113, 117, 105, 99, 107, 32, 98, 114, 111, 119,
+ (0,14): 110, 0,
+ (1,0): 102, 111, 120, 32, 106, 117, 109, 112, 115, 32, 111, 118, 101,
+ (1,13): 114, 32, 0,
+ (2,0): 116, 104, 101, 32, 53, 32, 108, 97, 122, 121, 32, 100, 111, 103,
+ (2,14): 115, 0
+ }
+ }
+}
+}
+\endcode
+
+It contains two Region References:
+\li A selection of four individual elements in dataset <code style="background-color:whitesmoke;">/DS2 : (0,1), (2,11), (1,0), (2,4)</code>
+See the #H5Sselect_elements API in the \ref UG for information on selecting individual elements.
+\li A selection of these blocks in dataset <code style="background-color:whitesmoke;">/DS2 : (0,0)-(0,2), (0,11)-(0,13), (2,0)-(2,2), (2,11)-(2,13)</code>
+See the #H5Sselect_hyperslab API in the \ref UG for how to do hyperslab selection.
+
+
+If you look at the code that creates the dataset (<code style="background-color:whitesmoke;">h5ex_t_regref.c</code>) you will see that the
+first reference is created with these calls:
+\code
+ status = H5Sselect_elements (space, H5S_SELECT_SET, 4, coords[0]);
+ status = H5Rcreate (&wdata[0], file, DATASET2, H5R_DATASET_REGION, space);
+\endcode
+
+where the buffer containing the coordinates to select is:
+\code
+ coords[4][2] = { {0, 1},
+ {2, 11},
+ {1, 0},
+ {2, 4} },
+\endcode
+
+The second reference is created by calling,
+\code
+ status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, stride, count, block);
+ status = H5Rcreate (&wdata[1], file, DATASET2, H5R_DATASET_REGION, space);
+\endcode
+where start, stride, count, and block have these values:
+\code
+ start[2] = {0, 0},
+ stride[2] = {2, 11},
+ count[2] = {2, 2},
+ block[2] = {1, 3};
+\endcode
+
+These start, stride, count, and block values will select the elements shown in bold in the dataset:
+\code
+84 104 101 32 113 117 105 99 107 32 98 114 111 119 110 0
+102 111 120 32 106 117 109 112 115 32 111 118 101 114 32 0
+116 104 101 32 53 32 108 97 122 121 32 100 111 103 115 0
+\endcode
+
+If you use <code style="background-color:whitesmoke;">h5dump</code> to select a subset of dataset
+<code style="background-color:whitesmoke;">/DS2</code> with these start, stride, count, and block values, you will see that the same elements are selected:
+\code
+$ h5dump -d "/DS2" -s "0,0" -S "2,11" -c "2,2" -k "1,3" h5ex_t_regref.h5
+HDF5 "h5ex_t_regref.h5" {
+DATASET "/DS2" {
+ DATATYPE H5T_STD_I8LE
+ DATASPACE SIMPLE { ( 3, 16 ) / ( 3, 16 ) }
+ SUBSET {
+ START ( 0, 0 );
+ STRIDE ( 2, 11 );
+ COUNT ( 2, 2 );
+ BLOCK ( 1, 3 );
+ DATA {
+ (0,0): 84, 104, 101, 114, 111, 119,
+ (2,0): 116, 104, 101, 100, 111, 103
+ }
+ }
+}
+}
+\endcode
+
+For more information on selections, see the tutorial topic on
+@ref LBDsetSubRW. Also see the
+\ref secViewToolsViewSub tutorial topic on using <code style="background-color:whitesmoke;">h5dump</code> to view a subset.
+
+\subsubsection subsubsecViewToolsViewDtypes_string String
+There are two types of string data, fixed length strings and variable length strings.
+
+Below is the <code style="background-color:whitesmoke;">h5dump</code> output for two files that have the same strings written to them. In one file,
+the strings are fixed in length, and in the other, the strings have different sizes (and are variable in size).
+
+<em>Dataset of Fixed Length Strings</em>
+\code
+HDF5 "h5ex_t_string.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_STRING {
+ STRSIZE 7;
+ STRPAD H5T_STR_SPACEPAD;
+ CSET H5T_CSET_ASCII;
+ CTYPE H5T_C_S1;
+ }
+ DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
+ DATA {
+ (0): "Parting", "is such", "sweet ", "sorrow."
+ }
+ }
+}
+}
+\endcode
+
+<em>Dataset of Variable Length Strings</em>
+\code
+HDF5 "h5ex_t_vlstring.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_STRING {
+ STRSIZE H5T_VARIABLE;
+ STRPAD H5T_STR_SPACEPAD;
+ CSET H5T_CSET_ASCII;
+ CTYPE H5T_C_S1;
+ }
+ DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
+ DATA {
+ (0): "Parting", "is such", "sweet", "sorrow."
+ }
+ }
+}
+}
+\endcode
+
+You might wonder which to use. Some comments to consider are included below.
+\li In general, a variable length string dataset is more complex than a fixed length string. If you don't
+specifically need a variable length type, then just use the fixed length string.
+\li A variable length dataset consists of pointers to heaps in different locations in the file. For this
+reason, a variable length dataset cannot be compressed. (Basically, the pointers get compressed and
+not the actual data!) If compression is needed, then do not use variable length types.
+\li If you need to create an array of of different length strings, you can either use fixed length strings
+along with compression, or use a variable length string.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+
+*/
diff --git a/doxygen/dox/ViewTools2.dox b/doxygen/dox/ViewTools2.dox
new file mode 100644
index 0000000..4d8788a
--- /dev/null
+++ b/doxygen/dox/ViewTools2.dox
@@ -0,0 +1,786 @@
+/** @page ViewToolsEdit Command-line Tools For Editing HDF5 Files
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+<hr>
+
+\section secViewToolsEditTOC Contents
+<ul>
+<li>\ref secViewToolsEditRemove</li>
+<li>\ref secViewToolsEditChange</li>
+<li>\ref secViewToolsEditApply</li>
+<li>\ref secViewToolsEditCopy</li>
+<li>\ref secViewToolsEditAdd</li>
+</ul>
+
+\section secViewToolsEditRemove Remove Inaccessible Objects and Unused Space in a File
+HDF5 files may accumulate unused space when they are read and rewritten to or if objects are deleted within
+them. With many edits and deletions this unused space can add up to a sizable amount.
+
+The <code style="background-color:whitesmoke;">h5repack</code> tool can be used to remove unused space in an HDF5
+file. If no options other than the input and output HDF5 files are specified on the
+<code style="background-color:whitesmoke;">h5repack</code> command line, it will write the file to the new
+file, getting rid of the unused space:
+\code
+h5repack <input file> <output file>
+\endcode
+
+\section secViewToolsEditChange Change a Dataset's Storage Layout
+The <code style="background-color:whitesmoke;">h5repack</code> utility can be used to change a dataset's storage
+layout. By default, the storage layout of a dataset is defined at creation time and it cannot be changed.
+However, with h5repack you can write an HDF5 file to a new file and change the layout for objects in the new file.
+
+The <code style="background-color:whitesmoke;">-l</code> option in <code style="background-color:whitesmoke;">h5repack</code>
+is used to change the layout for an object. The string following the <code style="background-color:whitesmoke;">-l</code>
+option defines the layout type and parameters for specified objects (or all objects):
+\code
+h5repack -l [list of objects:]<layout type>=<layout parameters> <input file> <output file>
+\endcode
+
+If no object is specified, then everything in the input file will be written to the output file with the specified
+layout type and parameters. If objects are specified then everything in the input file will be written to the
+output file as is, except for those specified objects. They will be written to the output file with the given
+layout type and parameters.
+
+Following is a description of the dataset layouts and the <code style="background-color:whitesmoke;">h5repack</code>
+options to use to change a dataset:
+<table>
+<tr>
+<th>Storage Layout</th><th>h5repack Option</th><th>Description</th>
+</tr>
+<tr>
+<td>Contiguous
+</td>
+<td>CONTI
+</td>
+<td>Data is stored physically together
+</td>
+</tr>
+<tr>
+<td>Chunked
+</td>
+<td>CHUNK=DIM[xDIM...xDIM]
+</td>
+<td>Data is stored in DIM[xDIM...xDIM] chunks
+</td>
+</tr>
+<tr>
+<td>Compact
+</td>
+<td>COMPA
+</td>
+<td>Data is stored in the header of the object (less I/O)
+</td>
+</tr>
+</table>
+
+If you type <code style="background-color:whitesmoke;">h5repack -h</code> on the command line, you will see
+a detailed usage statement with examples of modifying the layout.
+
+In the following example, the dataset <code style="background-color:whitesmoke;">/dset</code> in the file
+dset.h5 is contiguous, as shown by the <code style="background-color:whitesmoke;">h5dump -pH</code> command.
+The <code style="background-color:whitesmoke;">h5repack</code> utility writes dset.h5 to a new file, dsetrpk.h5,
+where the dataset <code style="background-color:whitesmoke;">dset</code> is chunked. This can be seen by examining
+the resulting dsetrpk.h5 file with <code style="background-color:whitesmoke;">h5dump</code>, as shown:
+\code
+$ h5dump -pH dset.h5
+HDF5 "dset.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ STORAGE_LAYOUT {
+ CONTIGUOUS
+ SIZE 96
+ OFFSET 1400
+ }
+ FILTERS {
+ NONE
+ }
+ FILLVALUE {
+ FILL_TIME H5D_FILL_TIME_IFSET
+ VALUE 0
+ }
+ ALLOCATION_TIME {
+ H5D_ALLOC_TIME_LATE
+ }
+ }
+}
+}
+
+$ h5repack -l dset:CHUNK=4x6 dset.h5 dsetrpk.h5
+
+$ h5dump -pH dsetrpk.h5
+HDF5 "dsetrpk.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ STORAGE_LAYOUT {
+ CHUNKED ( 4, 6 )
+ SIZE 96
+ }
+ FILTERS {
+ NONE
+ }
+ FILLVALUE {
+ FILL_TIME H5D_FILL_TIME_IFSET
+ VALUE 0
+ }
+ ALLOCATION_TIME {
+ H5D_ALLOC_TIME_INCR
+ }
+ }
+}
+}
+\endcode
+
+There can be many reasons that the storage layout needs to be changed for a dataset. For example,
+there may be a performance issue with a dataset due to a small chunk size.
+
+\section secViewToolsEditApply Apply Compression Filter to a Dataset
+The <code style="background-color:whitesmoke;">h5repack</code> utility can be used to compress or
+remove compression from a dataset in a file. By default, compression cannot be added to or removed
+from a dataset once it has been created. However, with <code style="background-color:whitesmoke;">h5repack</code>
+you can write a file to a new file and specify a compression filter to apply to a dataset or datasets in the new file.
+
+To apply a filter to an object in an HDF5 file, specify the <code style="background-color:whitesmoke;">-f</code> option,
+where the string following the <code style="background-color:whitesmoke;">-f</code> option defines the filter and
+its parameters (if there are any) to apply to a given object or objects:
+\code
+h5repack -f [list of objects:]<name of filter>=<filter parameters> <input file> <output file>
+\endcode
+
+If no objects are specified then everything in the input file will be written to the output file with
+the filter and parameters specified. If objects are specified, then everything in the input file will
+be written to the output file as is, except for the specified objects. They will be written to the
+output file with the filter and parameters specified.
+
+If you type <code style="background-color:whitesmoke;">h5repack --help</code> on the command line,
+you will see a detailed usage statement with examples of modifying a filter. There are actually
+numerous filters that you can apply to a dataset:
+<table>
+<tr>
+<th>Filter<th></th>Options</th>
+</tr>
+<tr>
+<td>GZIP compression (levels 1-9)
+<td>GZIP=&lt;deflation level&gt;
+</td>
+</tr>
+<tr>
+<td>SZIP compression
+<td>SZIP=<pixels per block,coding>
+</td>
+</tr>
+<tr>
+<td>Shuffle filter
+<td>SHUF
+</td>
+</tr>
+<tr>
+<td>Checksum filter
+<td>FLET
+</td>
+</tr>
+<tr>
+<td>NBIT compression
+<td>NBIT
+</td>
+</tr>
+<tr>
+<td>HDF5 Scale/Offset filter
+<td>SOFF=<scale_factor,scale_type>
+</td>
+</tr>
+<tr>
+<td>User defined filter
+<td>UD=<filter_number,cd_value_count,value_1[,value_2,...,value_N]>
+</td>
+</tr>
+<tr>
+<td>Remove ALL filters
+</td>
+<td>NONE
+</td>
+</tr>
+</table>
+
+Be aware that a dataset must be chunked to apply compression to it. If the dataset is not already chunked,
+then <code style="background-color:whitesmoke;">h5repack</code> will apply chunking to it. Both chunking
+and compression cannot be applied to a dataset at the same time with <code style="background-color:whitesmoke;">h5repack</code>.
+
+In the following example,
+\li <em>h5dump</em> lists the properties for the objects in <em>dset.h5</em>. Note that the dataset <em>dset</em> is contiguous.
+\li <em>h5repack</em> writes dset.h5 into a new file <em>dsetrpk.h5</em>, applying GZIP Level 5 compression to the dataset <em>/dset</em> in dsetrpk.h5.
+\li <em>h5dump</em> lists the properties for the new <em>dsetrpk.h5</em> file. Note that <em>/dset</em> is both compressed and chunked.
+
+<em>Example</em>
+\code
+$ h5dump -pH dset.h5
+HDF5 "dset.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 12, 18 ) / ( 12, 18 ) }
+ STORAGE_LAYOUT {
+ CONTIGUOUS
+ SIZE 864
+ OFFSET 1400
+ }
+ FILTERS {
+ NONE
+ }
+ FILLVALUE {
+ FILL_TIME H5D_FILL_TIME_IFSET
+ VALUE 0
+ }
+ ALLOCATION_TIME {
+ H5D_ALLOC_TIME_LATE
+ }
+ }
+}
+}
+
+$ h5repack -f dset:GZIP=5 dset.h5 dsetrpk.h5
+
+$ h5dump -pH dsetrpk.h5
+HDF5 "dsetrpk.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 12, 18 ) / ( 12, 18 ) }
+ STORAGE_LAYOUT {
+ CHUNKED ( 12, 18 )
+ SIZE 160 (5.400:1 COMPRESSION)
+ }
+ FILTERS {
+ COMPRESSION DEFLATE { LEVEL 5 }
+ }
+ FILLVALUE {
+ FILL_TIME H5D_FILL_TIME_IFSET
+ VALUE 0
+ }
+ ALLOCATION_TIME {
+ H5D_ALLOC_TIME_INCR
+ }
+ }
+}
+}
+\endcode
+
+\section secViewToolsEditCopy Copy Objects to Another File
+The <code style="background-color:whitesmoke;">h5copy</code> utility can be used to copy an object or
+objects from one HDF5 file to another or to a different location in the same file. It uses the
+#H5Ocopy and #H5Lcopy APIs in HDF5.
+
+Following are some of the options that can be used with <code style="background-color:whitesmoke;">h5copy</code>.
+<table>
+<tr>
+<th>h5copy Options</th><th>Description</th>
+</tr>
+<tr>
+<td>-i, --input
+</td>
+<td>Input file name
+</td>
+</tr>
+<tr>
+<td>-o, --output
+</td>
+<td>Output file name
+</td>
+</tr>
+<tr>
+<td>-s, --source
+</td>
+<td>Source object name
+</td>
+</tr>
+<tr>
+<td>-d, --destination
+</td>
+<td>Destination object name
+</td>
+</tr>
+<tr>
+<td>-p, --parents
+</td>
+<td>Make parent groups as needed
+</td>
+</tr>
+<tr>
+<td>-v, --verbose
+</td>
+<td>Verbose mode
+</td>
+</tr>
+<tr>
+<td>-f, --flag
+</td>
+<td>Flag type
+</td>
+</tr>
+</table>
+
+For a complete list of options and information on using <code style="background-color:whitesmoke;">h5copy</code>, type:
+\code
+h5copy --help
+\endcode
+
+In the example below, the dataset <code style="background-color:whitesmoke;">/MyGroup/Group_A/dset2</code>
+in <code style="background-color:whitesmoke;">groups.h5</code> gets copied to the root
+("<code style="background-color:whitesmoke;">/</code>") group of a new file,
+<code style="background-color:whitesmoke;">newgroup.h5</code>, with the name
+<code style="background-color:whitesmoke;">dset3</code>:
+\code
+$h5dump -H groups.h5
+HDF5 "groups.h5" {
+GROUP "/" {
+ GROUP "MyGroup" {
+ GROUP "Group_A" {
+ DATASET "dset2" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 2, 10 ) / ( 2, 10 ) }
+ }
+ }
+ GROUP "Group_B" {
+ }
+ DATASET "dset1" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 3, 3 ) / ( 3, 3 ) }
+ }
+ }
+}
+}
+
+$ h5copy -i groups.h5 -o newgroup.h5 -s /MyGroup/Group_A/dset2 -d /dset3
+
+$ h5dump -H newgroup.h5
+HDF5 "newgroup.h5" {
+GROUP "/" {
+ DATASET "dset3" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 2, 10 ) / ( 2, 10 ) }
+ }
+}
+}
+\endcode
+
+There are also <code style="background-color:whitesmoke;">h5copy</code> flags that can be specified
+with the <code style="background-color:whitesmoke;">-f</code> option. In the example below, the
+<code style="background-color:whitesmoke;">-f shallow</code> option specifies to copy only the
+immediate members of the group <code style="background-color:whitesmoke;">/MyGroup</code> from
+the <code style="background-color:whitesmoke;">groups.h5</code> file mentioned above to a new
+file <code style="background-color:whitesmoke;">mygrouponly.h5</code>:
+\code
+h5copy -v -i groups.h5 -o mygrouponly.h5 -s /MyGroup -d /MyGroup -f shallow
+\endcode
+
+The output of the above command is shown below. The verbose option <code style="background-color:whitesmoke;">-v</code>
+describes the action that was taken, as shown in the highlighted text.
+\code
+Copying file <groups.h5> and object </MyGroup> to file <mygrouponly.h5> and object </MyGroup>
+Using shallow flag
+
+$ h5dump -H mygrouponly.h5
+HDF5 "mygrouponly.h5" {
+GROUP "/" {
+ GROUP "MyGroup" {
+ GROUP "Group_A" {
+ }
+ GROUP "Group_B" {
+ }
+ DATASET "dset1" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 3, 3 ) / ( 3, 3 ) }
+ }
+ }
+}
+}
+\endcode
+
+\section secViewToolsEditAdd Add or Remove User Block from File
+The user block is a space in an HDF5 file that is not interpreted by the HDF5 library. It is a property
+list that can be added when creating a file. See the #H5Pset_userblock API in the \ref RM for more
+information regarding this property.
+
+Once created in a file, the user block cannot be removed. However, you can use the
+<code style="background-color:whitesmoke;">h5jam</code> and <code style="background-color:whitesmoke;">h5unjam</code>
+utilities to add or remove a user block from a file into a new file.
+
+These two utilities work similarly, except that <code style="background-color:whitesmoke;">h5jam</code>
+adds a user block to a file and <code style="background-color:whitesmoke;">h5unjam</code> removes the user
+block. You can also overwrite or delete a user block in a file.
+
+Specify the <code style="background-color:whitesmoke;">-h</code> option to see a complete list of options
+that can be used with <code style="background-color:whitesmoke;">h5jam</code> and
+<code style="background-color:whitesmoke;">h5unjam</code>. For example:
+\code
+ h5jam -h
+ h5unjam -h
+\endcode
+
+Below are the basic options for adding or removing a user block with <code style="background-color:whitesmoke;">h5jam</code>
+and <code style="background-color:whitesmoke;">h5unjam</code>:
+
+<table>
+<tr>
+<th>h5copy Options</th><th>Description</th>
+</tr>
+<tr>
+<td>-i
+</td>
+<td>Input File
+</td>
+</tr>
+<tr>
+<td>-o
+</td>
+<td>Output File
+</td>
+</tr>
+<tr>
+<td>-u
+</td>
+<td>File to add or remove from user block
+</td>
+</tr>
+</table>
+
+Let's say you wanted to add the program that creates an HDF5 file to its user block. As an example, you
+can take the <code style="background-color:whitesmoke;">h5_crtgrpar.c</code> program from the
+\ref LBExamples
+and add it to the file it creates, <code style="background-color:whitesmoke;">groups.h5</code>. This can
+be done with <code style="background-color:whitesmoke;">h5jam</code>, as follows:
+\code
+h5jam -i groups.h5 -u h5_crtgrpar.c -o groupsub.h5
+\endcode
+
+You can actually view the file with more <code style="background-color:whitesmoke;">groupsub.h5</code>
+to see that the <code style="background-color:whitesmoke;">h5_crtgrpar.c</code> file is indeed included.
+
+To remove the user block that was just added, type:
+\code
+h5unjam -i groupsub.h5 -u h5_crtgrparNEW.c -o groups-noub.h5
+\endcode
+
+This writes the user block in the file <code style="background-color:whitesmoke;">groupsub.h5</code>
+into <code style="background-color:whitesmoke;">h5_crtgrparNEW.c</code>. The new HDF5 file,
+<code style="background-color:whitesmoke;">groups-noub.h5</code>, will not contain a user block.
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+
+*/
+
+/** @page ViewToolsConvert Command-line Tools For Converting HDF5 Files
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+<hr>
+
+\section secViewToolsConvertTOC Contents
+<ul>
+<li>\ref secViewToolsConvertASCII</li>
+<li>\ref secViewToolsConvertBinary</li>
+<li>\ref secViewToolsConvertExport</li>
+</ul>
+
+\section secViewToolsConvertASCII Output HDF5 Dataset into an ASCII File (to Import into Excel and Other Applications)
+The <code style="background-color:whitesmoke;">h5dump</code> utility can be used to convert an HDF5 dataset
+into an ASCII file, which can then be imported into Excel and other applications. The following options are used:
+<table>
+<tr>
+<th>Options</th><th>Description</th>
+</tr>
+<tr>
+<td> -d D, --dataset=D
+</td>
+<td>Display dataset D
+</td>
+</tr>
+<tr>
+<td> -o F, --output=F
+</td>
+<td>Output raw data into file F
+</td>
+</tr>
+<tr>
+<td> -y, --noindex
+</td>
+<td>Suppress printing of array indices with the data
+</td>
+</tr>
+<tr>
+<td> -w N, --width=N
+</td>
+<td>Set N number of columns of output. A value of 0
+sets the number to 65535 (the maximum)
+</td>
+</tr>
+</table>
+
+As an example, <code style="background-color:whitesmoke;">h5_crtdat.c</code> from the \ref LBDsetCreate
+HDF5 Tutorial topic, creates the file <code style="background-color:whitesmoke;">dset.h5</code> with
+a dataset <code style="background-color:whitesmoke;">/dset</code> that is a 4 x 6 integer array. The
+following is displayed when viewing <code style="background-color:whitesmoke;">dset.h5</code> with
+<code style="background-color:whitesmoke;">h5dump</code>:
+\code
+$ h5dump dset.h5
+HDF5 "dset.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ (0,0): 1, 2, 3, 4, 5, 6,
+ (1,0): 7, 8, 9, 10, 11, 12,
+ (2,0): 13, 14, 15, 16, 17, 18,
+ (3,0): 19, 20, 21, 22, 23, 24
+ }
+ }
+}
+}
+\endcode
+
+The following command will output the values of the <code style="background-color:whitesmoke;">/dset</code>
+dataset to the ASCII file <code style="background-color:whitesmoke;">dset.asci</code>:
+\code
+h5dump -d /dset -o dset.asci -y -w 50 dset.h5
+\endcode
+
+In particular, note that:
+\li The default behavior of <code style="background-color:whitesmoke;">h5dump</code> is to print indices,
+and the <code style="background-color:whitesmoke;">-y</code> option suppresses this.
+\li The <code style="background-color:whitesmoke;">-w 50</code> option tells
+<code style="background-color:whitesmoke;">h5dump</code> to allow 50 columns for outputting the data. The
+value specified must be large enough to accommodate the dimension size of the dataset multiplied by the
+number of positions and spaces needed to print each value. If the value is not large enough, the output
+will wrap to the next line, and the data will not display as expected in Excel or other applications. To
+ensure that the output does not wrap to the next line, you can also specify 0 (zero) for the
+<code style="background-color:whitesmoke;">-w</code> option.
+
+In addition to creating the ASCII file <code style="background-color:whitesmoke;">dset.asci</code>, the
+above command outputs the metadata of the specified dataset:
+\code
+HDF5 "dset.h5" {
+DATASET "/dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ }
+}
+}
+\endcode
+
+The <code style="background-color:whitesmoke;">dset.asci</code> file will contain the values for the dataset:
+\code
+ 1, 2, 3, 4, 5, 6,
+ 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 18,
+ 19, 20, 21, 22, 23, 24
+\endcode
+
+\section secViewToolsConvertBinary Output HDF5 Dataset into Binary File
+The <code style="background-color:whitesmoke;">h5dump</code> utility can be used to convert an
+HDF5 dataset to a binary file with the following options:
+<table>
+<tr>
+<th>Options</th><th>Description</th>
+</tr>
+<tr>
+<td>-d D, --dataset=D
+</td>
+<td>Display dataset D
+</td>
+</tr>
+<tr>
+<td>-o F, --output=F
+</td>
+<td>Output raw data into file F
+</td>
+</tr>
+<tr>
+<td>-b B, --binary=B
+</td>
+<td>Binary file output of form B.
+Valid values are: LE, BE, NATIVE, FILE
+</td>
+</tr>
+</table>
+
+As an example, <code style="background-color:whitesmoke;">h5_crtdat.c</code> from the
+\ref LBDsetCreate HDF5 Tutorial topic, creates the file dset.h5 with a dataset
+<code style="background-color:whitesmoke;">/dset</code> that is a 4 x 6 integer array. The
+following is displayed when viewing <code style="background-color:whitesmoke;">dset.h5</code>
+with <code style="background-color:whitesmoke;">h5dump</code>:
+\code
+$ h5dump -d /dset/ dset.h5
+HDF5 "dset.h5" {
+DATASET "/dset/" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ (0,0): 1, 2, 3, 4, 5, 6,
+ (1,0): 7, 8, 9, 10, 11, 12,
+ (2,0): 13, 14, 15, 16, 17, 18,
+ (3,0): 19, 20, 21, 22, 23, 24
+ }
+}
+}
+\endcode
+
+As specified by the <code style="background-color:whitesmoke;">-d</code> and
+<code style="background-color:whitesmoke;">-o</code> options, the following
+<code style="background-color:whitesmoke;">h5dump</code> command will output the values of the dataset
+<code style="background-color:whitesmoke;">/dset </code>to a file called
+<code style="background-color:whitesmoke;">dset.bin</code>. The <code style="background-color:whitesmoke;">-b</code>
+option specifies that the output will be binary in Little Endian format (LE).
+
+\code
+h5dump -d /dset -b LE -o dset.bin dset.h5
+\endcode
+
+This command outputs the metadata for the dataset, as well as creating the binary file
+<code style="background-color:whitesmoke;">dset.bin</code>:
+\code
+HDF5 "dset.h5" {
+DATASET "/dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ }
+}
+}
+\endcode
+
+If you look at the resulting <code style="background-color:whitesmoke;">dset.bin</code> file with
+a binary editor, you will see that it contains the dataset's values. For example (on Linux) you will see:
+\code
+$ od -t d dset.bin
+0000000 1 2 3 4
+0000020 5 6 7 8
+0000040 9 10 11 12
+0000060 13 14 15 16
+0000100 17 18 19 20
+0000120 21 22 23 24
+0000140
+\endcode
+
+\section secViewToolsConvertExport Export from h5dump and Import into HDF5
+The <code style="background-color:whitesmoke;">h5import</code> utility can use the output of
+<code style="background-color:whitesmoke;">h5dump</code> as input to create a dataset or file.
+
+The <code style="background-color:whitesmoke;">h5dump</code> utility must first create two files:
+\li A DDL file, which will be used as an <code style="background-color:whitesmoke;">h5import</code> configuration file
+\li A raw data file containing the data to be imported
+
+The DDL file must be generated with the <code style="background-color:whitesmoke;">h5dump -p</code> option, to generate properties.
+
+The raw data file that can be imported into HDF5 using this method may contain either numeric or string data with the following restrictions:
+\li Numeric data requires the use of the <code style="background-color:whitesmoke;">h5dump -b</code> option to produce a binary data file.
+\li String data must be written with the <code style="background-color:whitesmoke;">h5dump -y</code> and
+<code style="background-color:whitesmoke;">--width=1</code> options, generating a single column of strings without indices.
+
+Two examples follow: the first imports a dataset with a numeric datatype. Note that numeric data requires
+the use of the <code style="background-color:whitesmoke;">h5dump -b</code> option to produce a binary data
+file. The example program (<code style="background-color:whitesmoke;">h5_crtdat.c</code>) that creates this
+file is included with the \ref IntroHDF5 tutorial and can be obtained from the \ref LBExamples page:
+\code
+h5dump -p -d "/dset" --ddl=dsetbin.dmp -o dset.bin -b dset.h5
+h5import dset.bin -c dsetbin.dmp -o new-dset.h5
+\endcode
+
+The output before and after running these commands is shown below:
+\code
+$ h5dump dset.h5
+HDF5 "dset.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ (0,0): 1, 2, 3, 4, 5, 6,
+ (1,0): 7, 8, 9, 10, 11, 12,
+ (2,0): 13, 14, 15, 16, 17, 18,
+ (3,0): 19, 20, 21, 22, 23, 24
+ }
+ }
+}
+}
+$ h5dump -p -d "/dset" --ddl=dsetbin.dmp -o dset.bin -b dset.h5
+
+$ h5import dset.bin -c dsetbin.dmp -o new-dset.h5
+
+$ h5dump new-dset.h5
+HDF5 "new-dset.h5" {
+GROUP "/" {
+ DATASET "dset" {
+ DATATYPE H5T_STD_I32BE
+ DATASPACE SIMPLE { ( 4, 6 ) / ( 4, 6 ) }
+ DATA {
+ (0,0): 1, 2, 3, 4, 5, 6,
+ (1,0): 7, 8, 9, 10, 11, 12,
+ (2,0): 13, 14, 15, 16, 17, 18,
+ (3,0): 19, 20, 21, 22, 23, 24
+ }
+ }
+}
+}
+\endcode
+
+The second example imports string data. The example program that creates this file can be downloaded
+from the <a href="https://portal.hdfgroup.org/display/HDF5/Examples+by+API">Examples by API</a> page.
+
+Note that string data requires use of the <code style="background-color:whitesmoke;">h5dump -y</code>
+option to exclude indexes and the <code style="background-color:whitesmoke;">h5dump --width=1</code>
+option to generate a single column of strings. The <code style="background-color:whitesmoke;">-o</code>
+option outputs the data into an ASCII file.
+\code
+h5dump -p -d "/DS1" -O vlstring.dmp -o vlstring.ascii -y --width=1 h5ex_t_vlstring.h5
+h5import vlstring.ascii -c vlstring.dmp -o new-vlstring.h5
+\endcode
+
+The output before and after running these commands is shown below:
+\code
+$ h5dump h5ex_t_vlstring.h5
+HDF5 "h5ex_t_vlstring.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_STRING {
+ STRSIZE H5T_VARIABLE;
+ STRPAD H5T_STR_SPACEPAD;
+ CSET H5T_CSET_ASCII;
+ CTYPE H5T_C_S1;
+ }
+ DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
+ DATA {
+ (0): "Parting", "is such", "sweet", "sorrow."
+ }
+ }
+}
+}
+
+$ h5dump -p -d "/DS1" -O vlstring.dmp -o vlstring.ascii -y --width=1 h5ex_t_vlstring.h5
+
+$ h5import vlstring.ascii -c vlstring.dmp -o new-vlstring.h5
+
+$ h5dump new-vlstring.h5
+HDF5 "new-vlstring.h5" {
+GROUP "/" {
+ DATASET "DS1" {
+ DATATYPE H5T_STRING {
+ STRSIZE H5T_VARIABLE;
+ STRPAD H5T_STR_NULLTERM;
+ CSET H5T_CSET_ASCII;
+ CTYPE H5T_C_S1;
+ }
+ DATASPACE SIMPLE { ( 4 ) / ( 4 ) }
+ DATA {
+ (0): "Parting", "is such", "sweet", "sorrow."
+ }
+ }
+}
+\endcode
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+
+*/
diff --git a/doxygen/dox/ViewToolsJPSS.dox b/doxygen/dox/ViewToolsJPSS.dox
new file mode 100644
index 0000000..9c15395
--- /dev/null
+++ b/doxygen/dox/ViewToolsJPSS.dox
@@ -0,0 +1,763 @@
+/** @page ViewToolsJPSS Use Case: Examining a JPSS NPP File With HDF5 Tools
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+<hr>
+
+\section secViewToolsJPSSTOC Contents
+<ul>
+<li>\ref secViewToolsJPSSDeter</li>
+<li>\ref secViewToolsJPSSView</li>
+<li>\ref secViewToolsJPSSExam</li>
+</ul>
+
+This tutorial illustrates how to use the HDF5 tools to examine NPP files from the JPSS project. The following files are discussed:
+\code
+SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5 (<a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5.gz">gzipped file</a>)
+SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5 (<a href="https://support.hdfgroup.org/ftp/HDF5/examples/files/tutorial/SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5.gz">gzipped file</a>)
+\endcode
+
+\section secViewToolsJPSSDeter Determining File Contents
+The first thing you may want to do is determine what is in your file. You can use the command-line tools or HDFView to do this:
+\li @ref subsecViewToolsJPSSDeter_h5dump
+\li @ref subsecViewToolsJPSSDeter_h5ls
+\li @ref subsecViewToolsJPSSDeter_HDFView
+
+JPSS NPP files all contain two root level groups:
+<table>
+<tr>
+<th>Group</th><th>Description</th>
+</tr>
+<tr>
+<td>/All_Data
+</td>
+<td>Contains the raw data and optional geo-location information.
+</td>
+</tr>
+<tr>
+<td>/Data_Products
+</td>
+<td>Contains a dataset ending in <code style="background-color:whitesmoke;">Aggr</code> with
+references to objects in the <code style="background-color:whitesmoke;">/All_Data</code> group.
+Contains granules (datasets with a name ending in <code style="background-color:whitesmoke;">Gran_#</code>)
+with references to selected regions in datasets under <code style="background-color:whitesmoke;">/All_Data</code>.
+</td>
+</tr>
+</table>
+
+\subsection subsecViewToolsJPSSDeter_h5dump h5dump
+With <code style="background-color:whitesmoke;">h5dump</code> you can see a list of the objects
+in the file using the <code style="background-color:whitesmoke;">-n</code> option:
+\code
+h5dump -n <file>
+\endcode
+
+For example:
+\code
+$ h5dump -n SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5
+HDF5 "SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5" {
+FILE_CONTENTS {
+ group /
+ group /All_Data
+ group /All_Data/VIIRS-M9-SDR_All
+ dataset /All_Data/VIIRS-M9-SDR_All/ModeGran
+ dataset /All_Data/VIIRS-M9-SDR_All/ModeScan
+ dataset /All_Data/VIIRS-M9-SDR_All/NumberOfBadChecksums
+ dataset /All_Data/VIIRS-M9-SDR_All/NumberOfDiscardedPkts
+ dataset /All_Data/VIIRS-M9-SDR_All/NumberOfMissingPkts
+ dataset /All_Data/VIIRS-M9-SDR_All/NumberOfScans
+ dataset /All_Data/VIIRS-M9-SDR_All/PadByte1
+ dataset /All_Data/VIIRS-M9-SDR_All/QF1_VIIRSMBANDSDR
+ dataset /All_Data/VIIRS-M9-SDR_All/QF2_SCAN_SDR
+ dataset /All_Data/VIIRS-M9-SDR_All/QF3_SCAN_RDR
+ dataset /All_Data/VIIRS-M9-SDR_All/QF4_SCAN_SDR
+ dataset /All_Data/VIIRS-M9-SDR_All/QF5_GRAN_BADDETECTOR
+ dataset /All_Data/VIIRS-M9-SDR_All/Radiance
+ dataset /All_Data/VIIRS-M9-SDR_All/RadianceFactors
+ dataset /All_Data/VIIRS-M9-SDR_All/Reflectance
+ dataset /All_Data/VIIRS-M9-SDR_All/ReflectanceFactors
+ group /Data_Products
+ group /Data_Products/VIIRS-M9-SDR
+ dataset /Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Aggr
+ dataset /Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_0
+ dataset /Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_1
+ dataset /Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_2
+ dataset /Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_3
+ }
+}
+\endcode
+
+In the output above you can see that there are four granules (ending in
+<code style="background-color:whitesmoke;">Gran_#</code>) in the
+<code style="background-color:whitesmoke;">/Data_Products/VIIRS-M9-SDR/</code> group.
+
+\subsection subsecViewToolsJPSSDeter_h5ls h5ls
+With <code style="background-color:whitesmoke;">h5ls</code> you can see a list of the objects in the
+file using the <code style="background-color:whitesmoke;">-lr</code>
+options. The <code style="background-color:whitesmoke;">h5ls</code> utility also shows shape and size
+(dataspace) information about datasets.
+\code
+h5ls -lr <file>
+\endcode
+
+For example:
+\code
+$ h5ls -lr SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5
+/ Group
+/All_Data Group
+/All_Data/VIIRS-M9-SDR_All Group
+/All_Data/VIIRS-M9-SDR_All/ModeGran Dataset {4/Inf}
+/All_Data/VIIRS-M9-SDR_All/ModeScan Dataset {192/Inf}
+/All_Data/VIIRS-M9-SDR_All/NumberOfBadChecksums Dataset {192/Inf}
+/All_Data/VIIRS-M9-SDR_All/NumberOfDiscardedPkts Dataset {192/Inf}
+/All_Data/VIIRS-M9-SDR_All/NumberOfMissingPkts Dataset {192/Inf}
+/All_Data/VIIRS-M9-SDR_All/NumberOfScans Dataset {4/Inf}
+/All_Data/VIIRS-M9-SDR_All/PadByte1 Dataset {12/Inf}
+/All_Data/VIIRS-M9-SDR_All/QF1_VIIRSMBANDSDR Dataset {3072/Inf, 3200/Inf}
+/All_Data/VIIRS-M9-SDR_All/QF2_SCAN_SDR Dataset {192/Inf}
+/All_Data/VIIRS-M9-SDR_All/QF3_SCAN_RDR Dataset {192/Inf}
+/All_Data/VIIRS-M9-SDR_All/QF4_SCAN_SDR Dataset {3072/Inf}
+/All_Data/VIIRS-M9-SDR_All/QF5_GRAN_BADDETECTOR Dataset {64/Inf}
+/All_Data/VIIRS-M9-SDR_All/Radiance Dataset {3072/Inf, 3200/Inf}
+/All_Data/VIIRS-M9-SDR_All/RadianceFactors Dataset {8/Inf}
+/All_Data/VIIRS-M9-SDR_All/Reflectance Dataset {3072/Inf, 3200/Inf}
+/All_Data/VIIRS-M9-SDR_All/ReflectanceFactors Dataset {8/Inf}
+/Data_Products Group
+/Data_Products/VIIRS-M9-SDR Group
+/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Aggr Dataset {16/Inf}
+/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_0 Dataset {16/Inf}
+/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_1 Dataset {16/Inf}
+/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_2 Dataset {16/Inf}
+/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_3 Dataset {16/Inf}
+\endcode
+Note that the <code style="background-color:whitesmoke;">Inf</code> indicates that those datasets are appendable or unlimited in size.
+
+\subsection subsecViewToolsJPSSDeter_HDFView HDFView
+If you open the file in HDFView, it will display the file and the root level groups within
+it in the TreeView on the left. An HDF5 file is a folder with a "5" in the middle, followed
+by the file name. There are two folders (groups) within the JPSS file
+(<code style="background-color:whitesmoke;">All_Data/</code> and <code style="background-color:whitesmoke;">Data Products/</code>),
+which you can select to see their contents:
+<table>
+<tr>
+<td>
+\image html hdfview-tree.png
+</td>
+</tr>
+</table>
+
+If you click twice with the left-mouse button on a folder or group in the TreeView, the contents
+of the folder will be listed. If you click twice on an object such as a dataset, a window with
+the object's values will be displayed.
+
+Underneath the <code style="background-color:whitesmoke;">VIIRS-M1-SDR</code> folder are what HDF5
+calls datasets. The scarlet letter <code style="background-color:whitesmoke;">"A"</code> attached
+to the group and datasets under <code style="background-color:whitesmoke;">Data_Products/</code>
+indicates that there are attributes associated with them.
+
+\section secViewToolsJPSSView Viewing the User Block
+All JPSS files contain a user block in XML with information about the file. The user block is an
+optional space allocated at the beginning of an HDF5 file that is not interpreted by the HDF5
+library. Its size is a multiple of 512.
+
+Since the user block in JPSS files is stored in ASCII and it is stored at the beginning of an
+HDF5 file, you could use a text editor or viewer to examine it. However, there are HDF5 utilities
+that can help with this:
+<table>
+<tr>
+<th>Utility</th><th>Description</th>
+</tr>
+<tr>
+<td>h5unjam
+</td>
+<td>Extracts a user block from an HDF5 file
+</td>
+</tr>
+<tr>
+<td>h5dump
+</td>
+<td>The -B (--superblock) option displays the size of the user block in an HDF5 file
+</td>
+</tr>
+</table>
+
+\subsection subsecViewToolsJPSSView_h5unjam h5unjam
+The \ref secViewToolsEditAdd tutorial topic discusses the use of the
+<code style="background-color:whitesmoke;">h5jam</code> and <code style="background-color:whitesmoke;">h5unjam</code>
+utilities for adding or removing a user block from a file. An input HDF5 file
+(<code style="background-color:whitesmoke;">-i</code>), output HDF5 file
+(<code style="background-color:whitesmoke;">-o</code>), and user block text file
+(<code style="background-color:whitesmoke;">-u</code>) can be specified with these tools. You can use the
+<code style="background-color:whitesmoke;">h5unjam</code> tool to extract and view the user block in a JPSS file:
+\code
+h5unjam -i <Input HDF5 File> -o <Output HDF5 File> -u <User Block File>
+\endcode
+
+For example this command will extract the user block into the file UB.xml:
+\code
+$ h5unjam -i SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5
+ -o svm09-noUB.h5 -u UB.xml
+\endcode
+
+The input HDF5 file remains unchanged. The output HDF5 file will not contain the user block.
+The <code style="background-color:whitesmoke;">UB.xml</code> file contains the user block
+which can be viewed with a browser.
+
+\subsection subsecViewToolsJPSSView_h5dump h5dump
+The h5dump utility has the <code style="background-color:whitesmoke;">-B (--superblock)</code> option for displaying the superblock in an HDF5 file.
+The superblock contains information about the file such as the file signature, file consistency flags,
+the number of bytes to store addresses and size of an object, as well as the size of the user block:
+\code
+h5dump -B (--superblock)
+\endcode
+
+Below is an example (Unix):
+\code
+$ h5dump -B -H SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5 | more
+HDF5 "SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5" {
+SUPER_BLOCK {
+ SUPERBLOCK_VERSION 0
+ FREELIST_VERSION 0
+ SYMBOLTABLE_VERSION 0
+ OBJECTHEADER_VERSION 0
+ OFFSET_SIZE 8
+ LENGTH_SIZE 8
+ BTREE_RANK 16
+ BTREE_LEAF 4
+ ISTORE_K 32
+ USER_BLOCK {
+ USERBLOCK_SIZE 1024
+ }
+}
+\endcode
+
+Once you have the size of the user block, you can extract it from the file using system commands.
+For example, on Unix platforms you can use the head command-line tool:
+\code
+head -c <USERBLOCK_SIZE> <JPSS File> >& USERBLOCK.xml
+\endcode
+
+There are Unix tools for Windows that may work, such as <a href="http://gnuwin32.sourceforge.net/packages/coreutils.htm">CoreUtils for Windows</a>.
+
+\section secViewToolsJPSSExam Examining a Granule
+<ul>
+<li>@ref subsecViewToolsJPSSExam_h5dump<br />
+<ul>
+<li>@ref subsubsecViewToolsJPSSExam_h5dumpRegRef</li>
+<li>@ref subsubsecViewToolsJPSSExam_h5dumpQuality</li>
+<li>@ref subsubsecViewToolsJPSSExam_h5dumpProps</li>
+</ul></li>
+<li>@ref subsecViewToolsJPSSExamr_HDFView</li>
+</ul>
+
+\subsection subsecViewToolsJPSSExam_h5dump h5dump
+There are several options that you may first want to use when examining a granule with h5dump:
+<table>
+<tr>
+<th>Option</th><th>Description</th>
+</tr>
+<tr>
+<td>-H, --header
+</td>
+<td>Prints header (metadata) information only
+</td>
+</tr>
+<tr>
+<td>-d D, --dataset=D
+</td>
+<td>Specifies the granule dataset
+</td>
+</tr>
+<tr>
+<td>-A 0, --onlyattr=0
+</td>
+<td>Suppresses attributes
+</td>
+</tr>
+<tr>
+<td>-p, --properties
+</td>
+<td>Show properties of datasets
+(See Properties)
+</td>
+</tr>
+</table>
+
+You would specify the dataset (<code style="background-color:whitesmoke;">-d D</code>) and the
+<code style="background-color:whitesmoke;">-H</code> options to view the metadata associated with
+a specific granule. There are many attributes associated with a granule and
+<code style="background-color:whitesmoke;">-A 0</code> can be used to suppress those.
+
+For example:
+\code
+h5dump -H -A 0 -d "/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_0"
+ SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5
+\endcode
+
+This command displays:
+\code
+ HDF5 "SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5" {
+ DATASET "/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_0" {
+ DATATYPE H5T_REFERENCE { H5T_STD_REF_DSETREG }
+ DATASPACE SIMPLE { ( 16 ) / ( H5S_UNLIMITED ) }
+ }
+ }
+\endcode
+
+To see the actual contents of the granule remove the <code style="background-color:whitesmoke;">-H</code> option:
+\code
+h5dump -A 0 -d "/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_0"
+ SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5
+\endcode
+
+The above command displays:
+\code
+HDF5 "SVM09_npp_d20120229_t0849107_e0854511_b01759_c20120229145452682127_noaa_ops.h5" {
+DATASET "/Data_Products/VIIRS-M9-SDR/VIIRS-M9-SDR_Gran_0" {
+ DATATYPE H5T_REFERENCE { H5T_STD_REF_DSETREG }
+ DATASPACE SIMPLE { ( 16 ) / ( H5S_UNLIMITED ) }
+ DATA {
+ DATASET /All_Data/VIIRS-M9-SDR_All/Radiance {(0,0)-(767,3199)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/Reflectance {(0,0)-(767,3199)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/ModeScan {(0)-(47)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/ModeGran {(0)-(0)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/PadByte1 {(0)-(2)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/NumberOfScans {(0)-(0)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/NumberOfMissingPkts {(0)-(47)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/NumberOfBadChecksums {(0)-(47)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/NumberOfDiscardedPkts {(0)-(47)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/QF1_VIIRSMBANDSDR {(0,0)-(767,3199)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/QF2_SCAN_SDR {(0)-(47)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/QF3_SCAN_RDR {(0)-(47)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/QF4_SCAN_SDR {(0)-(767)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/QF5_GRAN_BADDETECTOR {(0)-(15)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/RadianceFactors {(0)-(1)},
+ DATASET /All_Data/VIIRS-M9-SDR_All/ReflectanceFactors {(0)-(1)}
+ }
+}
+}
+\endcode
+
+As you can see in the output above, the datatype for this dataset is:
+\code
+DATATYPE H5T_REFERENCE { H5T_STD_REF_DSETREG }
+\endcode
+
+This indicates that it is a dataset specifically for storing references to regions (or subsets)
+in other datasets. The dataset contains 16 such references, and more can be added to it, as
+indicated by the dataspace (in other words it is unlimited):
+\code
+DATASPACE SIMPLE { ( 16 ) / ( H5S_UNLIMITED ) }
+\endcode
+
+\subsubsection subsubsecViewToolsJPSSExam_h5dumpRegRef Viewing a Region Reference
+What if we wanted to look at the <code style="background-color:whitesmoke;">NumberOfScans</code> data for a specific granule in a file?
+
+First, we may be interested in determining whether the scans were done at night or in the day. If a scan was at night, there will be no data.
+
+The attribute <code style="background-color:whitesmoke;">N_Day_Night_Flag</code> is used to determine when the scan was done. If you don't know where this attribute is located, you can use the <code style="background-color:whitesmoke;">-N</code> option to search for it in the file. If you were to run this command on the <code style="background-color:whitesmoke;">SVM09</code> file used above, you would see that the <code style="background-color:whitesmoke;">N_Day_Night_Flag</code> attribute has a value of <code style="background-color:whitesmoke;">Night</code> for the four granules in the file. Indeed, if you actually examine the <code style="background-color:whitesmoke;">NumberOfScans</code> data, you will see that only fill values are written.
+
+For that reason we will examine the <code style="background-color:whitesmoke;">NumberOfScans</code> data for the <code style="background-color:whitesmoke;">SVMO1</code> file below, as it was obtained during the day:
+\code
+h5dump -N N_Day_Night_Flag SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+\endcode
+
+It displays:
+\code
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+ATTRIBUTE "N_Day_Night_Flag" {
+ DATATYPE H5T_STRING {
+ STRSIZE 4;
+ STRPAD H5T_STR_NULLTERM;
+ CSET H5T_CSET_ASCII;
+ CTYPE H5T_C_S1;
+ }
+ DATASPACE SIMPLE { ( 1, 1 ) / ( 1, 1 ) }
+ DATA {
+ (0,0): "Day"
+ }
+}
+}
+\endcode
+
+There is just one granule in this <code style="background-color:whitesmoke;">SVM01</code> file, as shown below:
+\code
+$ h5dump -n SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+FILE_CONTENTS {
+ group /
+ group /All_Data
+ group /All_Data/VIIRS-M1-SDR_All
+ dataset /All_Data/VIIRS-M1-SDR_All/ModeGran
+ dataset /All_Data/VIIRS-M1-SDR_All/ModeScan
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfBadChecksums
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfDiscardedPkts
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfMissingPkts
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfScans
+ dataset /All_Data/VIIRS-M1-SDR_All/PadByte1
+ dataset /All_Data/VIIRS-M1-SDR_All/QF1_VIIRSMBANDSDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF2_SCAN_SDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF3_SCAN_RDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF4_SCAN_SDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF5_GRAN_BADDETECTOR
+ dataset /All_Data/VIIRS-M1-SDR_All/Radiance
+ dataset /All_Data/VIIRS-M1-SDR_All/RadianceFactors
+ dataset /All_Data/VIIRS-M1-SDR_All/Reflectance
+ dataset /All_Data/VIIRS-M1-SDR_All/ReflectanceFactors
+ group /Data_Products
+ group /Data_Products/VIIRS-M1-SDR
+ dataset /Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Aggr
+ dataset /Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0
+ }
+}
+\endcode
+
+Now examine the references in the <code style="background-color:whitesmoke;">VIIRS-M1-SDR_Gran_0</code> granule
+\code
+$ h5dump -A 0 -d "/Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0"
+ SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+DATASET "/Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0" {
+ DATATYPE H5T_REFERENCE { H5T_STD_REF_DSETREG }
+ DATASPACE SIMPLE { ( 16 ) / ( H5S_UNLIMITED ) }
+ DATA {
+ DATASET /All_Data/VIIRS-M1-SDR_All/Radiance {(0,0)-(767,3199)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/Reflectance {(0,0)-(767,3199)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/ModeScan {(0)-(47)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/ModeGran {(0)-(0)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/PadByte1 {(0)-(2)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/NumberOfScans {(0)-(0)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/NumberOfMissingPkts {(0)-(47)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/NumberOfBadChecksums {(0)-(47)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/NumberOfDiscardedPkts {(0)-(47)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/QF1_VIIRSMBANDSDR {(0,0)-(767,3199)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/QF2_SCAN_SDR {(0)-(47)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/QF3_SCAN_RDR {(0)-(47)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/QF4_SCAN_SDR {(0)-(767)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/QF5_GRAN_BADDETECTOR {(0)-(15)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/RadianceFactors {(0)-(1)},
+ DATASET /All_Data/VIIRS-M1-SDR_All/ReflectanceFactors {(0)-(1)}
+ }
+}
+}
+\endcode
+
+In the output above, you can see that the <code style="background-color:whitesmoke;">NumberOfScans</code>
+reference is the sixth reference in the granule counting from the top.
+
+The list of references shown above is a 0-based index to the dataset. Therefore, to specify
+<code style="background-color:whitesmoke;">NumberOfScans</code>, enter a start offset of
+<code style="background-color:whitesmoke;">5</code> for the <code style="background-color:whitesmoke;">-s</code>
+option (the sixth reference minus 1). To see the region reference data, use the <code style="background-color:whitesmoke;">-R</code> option.
+
+This command will display the data in the <code style="background-color:whitesmoke;">NumberOfScans</code> region reference:
+\code
+h5dump -A 0 -d "/Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0" -s 5 -R
+ SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+\endcode
+
+It displays the number of scans (48):
+\code
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+DATASET "/Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0" {
+ DATATYPE H5T_REFERENCE { H5T_STD_REF_DSETREG }
+ DATASPACE SIMPLE { ( 16 ) / ( H5S_UNLIMITED ) }
+ SUBSET {
+ START ( 5 );
+ STRIDE ( 1 );
+ COUNT ( 1 );
+ BLOCK ( 1 );
+ DATA {
+ (5): DATASET /All_Data/VIIRS-M1-SDR_All/NumberOfScans {
+ (5): REGION_TYPE BLOCK (0)-(0)
+ (5): DATATYPE H5T_STD_I32BE
+ (5): DATASPACE SIMPLE { ( 1 ) / ( H5S_UNLIMITED ) }
+ (5): DATA {
+ (0): 48
+ (5): }
+ (5): }
+ }
+ }
+}
+}
+\endcode
+
+The <code style="background-color:whitesmoke;">-s</code> option may be familiar as one of the options
+that was described in the \ref secViewToolsViewSub tutorial topic. The other subsetting options are not included,
+indicating that the default values are used.
+
+If you leave off the <code style="background-color:whitesmoke;">-R</code> option, you will see the subset selection, but not the data:
+\code
+$ h5dump -A 0 -d "/Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0" -s 5
+ SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+DATASET "/Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0" {
+ DATATYPE H5T_REFERENCE { H5T_STD_REF_DSETREG }
+ DATASPACE SIMPLE { ( 16 ) / ( H5S_UNLIMITED ) }
+ SUBSET {
+ START ( 5 );
+ STRIDE ( 1 );
+ COUNT ( 1 );
+ BLOCK ( 1 );
+ DATA {
+ DATASET /All_Data/VIIRS-M1-SDR_All/NumberOfScans {(0)-(0)}
+ }
+ }
+}
+}
+\endcode
+
+\subsubsection subsubsecViewToolsJPSSExam_h5dumpQuality Viewing a Quality Flag
+The quality flags in an NPP file can be viewed with h5dump using the <code style="background-color:whitesmoke;">-M</code>
+option. Quality flags are packed into each integer value in a quality flag dataset. Quality flag datasets in NPP
+files begin with the letters <code style="background-color:whitesmoke;">QF</code>.
+
+In the following NPP file, there are five Quality Flag datasets
+(<code style="background-color:whitesmoke;">/All_Data/VIIRS-M1-SDR_All/QF*</code>):
+\code
+$ h5dump -n SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+FILE_CONTENTS {
+ group /
+ group /All_Data
+ group /All_Data/VIIRS-M1-SDR_All
+ dataset /All_Data/VIIRS-M1-SDR_All/ModeGran
+ dataset /All_Data/VIIRS-M1-SDR_All/ModeScan
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfBadChecksums
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfDiscardedPkts
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfMissingPkts
+ dataset /All_Data/VIIRS-M1-SDR_All/NumberOfScans
+ dataset /All_Data/VIIRS-M1-SDR_All/PadByte1
+ dataset /All_Data/VIIRS-M1-SDR_All/QF1_VIIRSMBANDSDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF2_SCAN_SDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF3_SCAN_RDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF4_SCAN_SDR
+ dataset /All_Data/VIIRS-M1-SDR_All/QF5_GRAN_BADDETECTOR
+ dataset /All_Data/VIIRS-M1-SDR_All/Radiance
+ dataset /All_Data/VIIRS-M1-SDR_All/RadianceFactors
+ dataset /All_Data/VIIRS-M1-SDR_All/Reflectance
+ dataset /All_Data/VIIRS-M1-SDR_All/ReflectanceFactors
+ group /Data_Products
+ group /Data_Products/VIIRS-M1-SDR
+ dataset /Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Aggr
+ dataset /Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0
+ }
+}
+\endcode
+
+The flags in this particular dataset happen to be stored in every two bits of each quality flag dataset
+element, and the values range from 0 to 2. In other words, to see the quality flag values for this
+dataset, these bits would be examined: 0 and 1, 2 and 3, 4 and 5, or 6 and 7 (This information was
+obtained from the Product Profile XML File.)
+
+For example, bits 0 and 1 in the <code style="background-color:whitesmoke;">VQF1_VIIRSMBANDSDR</code> dataset specify the flag that
+"Indicates calibration quality due to bad space view offsets, OBC view offsets, etc or use of a
+previous calibration view". It has 3 values: Good (0), Poor (1), or No Calibration (2).
+
+The <code style="background-color:whitesmoke;">-M</code> option is used to specify the quality
+flag bit offset (<code style="background-color:whitesmoke;">O</code>) and length (<code style="background-color:whitesmoke;">L</code>):
+\code
+h5dump -d DATASET -M O,L FILE
+\endcode
+
+To view the first quality flag (0-1) in a 5 x 6 subset of the <code style="background-color:whitesmoke;">QF1_VIIRSMBANDSDR</code> dataset, specify:
+\code
+h5dump -d "/All_Data/VIIRS-M1-SDR_All/QF1_VIIRSMBANDSDR[0,0;;5,6;]"
+ -M 0,2 SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+\endcode
+
+This outputs:
+\code
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+DATASET "/All_Data/VIIRS-M1-SDR_All/QF1_VIIRSMBANDSDR" {
+ DATATYPE H5T_STD_U8BE
+ DATASPACE SIMPLE { ( 768, 3200 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+ PACKED_BITS OFFSET=0 LENGTH=2
+ SUBSET {
+ START ( 0, 0 );
+ STRIDE ( 1, 1 );
+ COUNT ( 5, 6 );
+ BLOCK ( 1, 1 );
+ DATA {
+ (0,0): 2, 2, 2, 2, 2, 2,
+ (1,0): 2, 2, 2, 2, 2, 2,
+ (2,0): 0, 0, 0, 0, 0, 0,
+ (3,0): 0, 0, 0, 0, 0, 0,
+ (4,0): 0, 0, 0, 0, 0, 0
+ }
+ }
+}
+}
+\endcode
+
+To view more than one quality flag at a time simply add the bit offset and length values to
+<code style="background-color:whitesmoke;">-M</code>, separated by commas. For example, this
+<code style="background-color:whitesmoke;">-M</code> option specifies bits 0-1 and 2-3:
+\code
+h5dump -d DATASET -M 0,2,2,2 FILE
+\endcode
+
+\subsubsection subsubsecViewToolsJPSSExam_h5dumpProps Properties
+To view properties of a specific dataset with <code style="background-color:whitesmoke;">h5dump</code>
+use the <code style="background-color:whitesmoke;">-p</code> option along with the
+<code style="background-color:whitesmoke;">-d</code> option. Depending on the number of attributes
+and the amount of data, the <code style="background-color:whitesmoke;">-A 0</code> and
+<code style="background-color:whitesmoke;">-H</code> options can also be specified to suppress
+printing of attributes and data values:
+\code
+h5dump -p -H -A 0 -d DATASET
+\endcode
+
+The <code style="background-color:whitesmoke;">-p</code> option shows any compression filters
+associated with a dataset, as well as layout and fill value information. This option can be helpful
+in diagnosing performance and other issues.
+
+As an example, examine the <code style="background-color:whitesmoke;">/All_Data/VIIRS-M1-SDR_All/Radiance</code>
+dataset in the <code style="background-color:whitesmoke;">SVM01</code> file:
+\code
+$ h5dump -p -H -A 0 -d "/All_Data/VIIRS-M1-SDR_All/Radiance"
+ SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+HDF5 "SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5" {
+DATASET "/All_Data/VIIRS-M1-SDR_All/Radiance" {
+ DATATYPE H5T_STD_U16BE
+ DATASPACE SIMPLE { ( 768, 3200 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+ STORAGE_LAYOUT {
+ CHUNKED ( 768, 3200 )
+ SIZE 4915200
+ }
+ FILTERS {
+ NONE
+ }
+ FILLVALUE {
+ FILL_TIME H5D_FILL_TIME_IFSET
+ VALUE 65529
+ }
+ ALLOCATION_TIME {
+ H5D_ALLOC_TIME_INCR
+ }
+}
+}
+\endcode
+
+We can see that the chunk size for this dataset is 768 x 3200, and the storage size is 4915200.
+
+What if the chunk size were smaller?
+
+The dataset was modified to have a chunk size of 1 x 10, using the
+<code style="background-color:whitesmoke;">h5repack</code> utility, as shown below.
+\code
+$ h5repack -l /All_Data/VIIRS-M1-SDR_All/Radiance:CHUNK=1x10
+ SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5 SVM01repack.h5
+
+$ h5dump -p -H -A 0 -d "/All_Data/VIIRS-M1-SDR_All/Radiance" SVM01repack.h5
+HDF5 "SVM01repack.h5" {
+DATASET "/All_Data/VIIRS-M1-SDR_All/Radiance" {
+ DATATYPE H5T_STD_U16BE
+ DATASPACE SIMPLE { ( 768, 3200 ) / ( H5S_UNLIMITED, H5S_UNLIMITED ) }
+ STORAGE_LAYOUT {
+ CHUNKED ( 1, 10 )
+ SIZE 4915200
+ }
+ FILTERS {
+ NONE
+ }
+ FILLVALUE {
+ FILL_TIME H5D_FILL_TIME_IFSET
+ VALUE 65529
+ }
+ ALLOCATION_TIME {
+ H5D_ALLOC_TIME_INCR
+ }
+}
+}
+\endcode
+
+In this case, the storage size of the dataset is the same, but the size of the file almost doubled!:
+\code
+$ ls -1sh
+total 35M
+12M SVM01_npp_d20130524_t1255132_e1256374_b08146_c20130524192048864992_noaa_ops.h5
+23M SVM01repack.h5
+\endcode
+
+In general, the smaller the chunk size, the more chunks that HDF5 has to keep track of, which increases
+the size of the file and can affect performance.
+
+\subsection subsecViewToolsJPSSExamr_HDFView HDFView
+As mentioned previously, the structure of an HDF5 file is displayed in the TreeView on the left side of the HDFView screen,
+and you can click on objects and have metadata information displayed on the right side.
+
+To discover more about the granule <code style="background-color:whitesmoke;">/Data_Products/VIIRS-M1-SDR/VIIRS-M1-SDR_Gran_0</code>
+in the <code style="background-color:whitesmoke;">SVM01</code> file shown below in the TreeView, position
+the mouse over the granule and click to select. Properties for the object is displayed on the right side of the HDFView screen.
+You can see Datatype and Dataspace information on the <code style="background-color:whitesmoke;">General Object Info</code>
+tab, any Attributes associated with the granulewill be on the
+<code style="background-color:whitesmoke;">Object Attribute Info</code> tab. In the
+<code style="background-color:whitesmoke;">General Object Info</code>, you can see that the dataset is a
+Region Reference dataset, and that there are sixteen Region References in this dataset:
+<table>
+<tr>
+<td>
+\image html hdfview-prop.png
+</td>
+</tr>
+</table>
+
+To examine the data in the granule, click twice on it with the left mouse button in the TreeView,
+and it will open in a new window.:
+<table>
+<tr>
+<td>
+\image html hdfview-regref.png
+</td>
+</tr>
+</table>
+
+If you click twice with the left mouse button on the fifth Region Reference
+<code style="background-color:whitesmoke;">/All_Data/VIIRS-M1-SDR_All/NumberOfScans</code> a window
+will pop up with the value(s) of the reference:
+<table>
+<tr>
+<td>
+\image html hdfview-regref2.png
+</td>
+</tr>
+</table>
+
+You can also set a user option to automatically show the value(s) in a Region Reference. Under the
+<code style="background-color:whitesmoke;">Tools</code> pull-down menu, select
+<code style="background-color:whitesmoke;">User Options</code> and then select
+<code style="background-color:whitesmoke;">HDF Settings</code> and then select
+<code style="background-color:whitesmoke;">Show RegRef Values</code> in the
+<code style="background-color:whitesmoke;">Data</code> section (see the middle of the image below):
+<table>
+<tr>
+<td>
+\image html hdfview-regrefval.png
+</td>
+</tr>
+</table>
+
+Then you will automatically see the values of the Region Reference when you open it and select an entry:
+<table>
+<tr>
+<td>
+\image html hdfview-regref1.png
+</td>
+</tr>
+</table>
+
+You can view and set quality flags by clicking the right mouse button over a quality flags dataset under
+<code style="background-color:whitesmoke;">All_Data</code> and selecting
+<code style="background-color:whitesmoke;">Open As</code> from the pop-up menu. In the middle of
+the window that pops up, you will see where you can specify <code style="background-color:whitesmoke;">Bitmask</code> options.
+<table>
+<tr>
+<td>
+\image html hdfview-qf.png
+</td>
+</tr>
+</table>
+
+<hr>
+Navigate back: \ref index "Main" / \ref GettingStarted / \ref ViewToolsCommand
+
+*/
diff --git a/doxygen/dox/high_level/extension.dox b/doxygen/dox/high_level/extension.dox
index c81ac6e..d754b96 100644
--- a/doxygen/dox/high_level/extension.dox
+++ b/doxygen/dox/high_level/extension.dox
@@ -1,60 +1,51 @@
/** \defgroup H5LR Extensions
*
- * <em>Working with region references, hyperslab selections,
+ * <em>Working with region references, hyperslab selections,
* and bit-fields (H5LR, H5LT)</em>
*
- * The following reference manual entries describe high-level HDF5 C and Fortran APIs
- * for working with region references, hyperslab selections, and bit-fields.
- * These functions were created as part of a project supporting
+ * The following reference manual entries describe high-level HDF5 C and Fortran APIs
+ * for working with region references, hyperslab selections, and bit-fields.
+ * These functions were created as part of a project supporting
* NPP/NPOESS Data Production and Exploitation (
* <a href="https://support.hdfgroup.org/projects/jpss/documentation">
- * project </a>,
- * <a href="https://gamma.hdfgroup.org/ftp/pub/outgoing/NPOESS/source">
- * software </a>).
- * While they were written to facilitate access to NPP, NPOESS, and JPSS
- * data in the HDF5 format, these functions may be useful to anyone working
+ * project</a>, <a href="https://gamma.hdfgroup.org/ftp/pub/outgoing/NPOESS/source">
+ * software </a>).
+ * While they were written to facilitate access to NPP, NPOESS, and JPSS
+ * data in the HDF5 format, these functions may be useful to anyone working
* with region references, hyperslab selections, or bit-fields.
*
* Note that these functions are not part of the standard HDF5 distribution;
- * the
- * <a href="https://gamma.hdfgroup.org/ftp/pub/outgoing/NPOESS/source">
- * software </a>
+ * the <a href="https://gamma.hdfgroup.org/ftp/pub/outgoing/NPOESS/source">
+ * software </a>
* must be separately downloaded and installed.
*
- * A comprehensive guide to this library,
- * <a href="https://support.hdfgroup.org/projects/jpss/documentation/HL/UG/NPOESS_HL-UG.pdf">
+ * A comprehensive guide to this library,
+ * <a href="https://support.hdfgroup.org/projects/jpss/documentation/HL/UG/NPOESS_HL-UG.pdf">
* <em>User Guide to the HDF5 High-level Library for Handling Region References and Hyperslab Selections</em></a>
- * is available at
+ * is available at
* https://support.hdfgroup.org/projects/jpss/documentation/HL/UG/NPOESS_HL-UG.pdf.
*
* - \ref H5LRcopy_reference
- * \n Copies data from the specified dataset to a new location and
- * creates a reference to it.
+ * \n Copies data from the specified dataset to a new location and creates a reference to it.
* - \ref H5LRcopy_region
- * \n Copies data from a referenced region to a region in a
- * destination dataset.
+ * \n Copies data from a referenced region to a region in a destination dataset.
* - \ref H5LRcreate_ref_to_all
- * \n Creates a dataset with the region references to the data in all
- * datasets located under a specified group in a file or creates a
- * dataset with object references to all objects (groups or datasets)
+ * \n Creates a dataset with the region references to the data in all datasets located under a
+ * specified group in a file or creates a dataset with object references to all objects (groups or datasets)
* located under a specified group in a file.
* - \ref H5LRcreate_region_references
- * \n Creates an array of region references using an array of paths to
+ * \n Creates an array of region references using an array of paths to
* datasets and an array of corresponding hyperslab descriptions.
* - \ref H5LRget_region_info
* \n Retrieves information about the data a region reference points to.
* - \ref H5LRmake_dataset
- * \n Creates and writes a dataset containing a list of
- * region references.
+ * \n Creates and writes a dataset containing a list of region references.
* - \ref H5LRread_region
- * \n Retrieves raw data pointed to by a region reference to
- * an application buffer.
+ * \n Retrieves raw data pointed to by a region reference to an application buffer.
* - \ref H5LTcopy_region
- * \n Copies data from a specified region in a source dataset
- * to a specified region in a destination dataset.
+ * \n Copies data from a specified region in a source dataset to a specified region in a destination dataset.
* - \ref H5LTread_bitfield_value
- * \n Retrieves the values of quality flags for each element
- * to the application provided buffer.
+ * \n Retrieves the values of quality flags for each element to the application provided buffer.
* - \ref H5LTread_region
* \n Reads selected data to an application buffer.
*
@@ -77,24 +68,24 @@
* \param[in] path Path to the dataset being created
* \param[in] type_id Datatype of the dataset
* \param[in] buf_size Size of the \p loc_id_ref and \p buf arrays
- * \param[in] loc_id_ref Array of object identifiers; each identifier
- * describes to which HDF5 file the corresponding
+ * \param[in] loc_id_ref Array of object identifiers; each identifier
+ * describes to which HDF5 file the corresponding
* region reference belongs to
* \param[in] buf Array of region references
*
* \return \herr_t
*
- * \details Given an array of size \p buf_size of region references \p buf,
- * the function will create a dataset with path \p path, at location
- * specified by \p loc_id and of a datatype specified by \p type_id,
- * and will write data associated with each region reference in the order
- * corresponding to the order of the region references in the buffer.
- * It is assumed that all referenced hyperslabs have the same dimensionality,
- * and only the size of the slowest changing dimension may differ.
- * Each reference in the \p buf array belongs to the file identified
+ * \details Given an array of size \p buf_size of region references \p buf,
+ * the function will create a dataset with path \p path, at location
+ * specified by \p loc_id and of a datatype specified by \p type_id,
+ * and will write data associated with each region reference in the order
+ * corresponding to the order of the region references in the buffer.
+ * It is assumed that all referenced hyperslabs have the same dimensionality,
+ * and only the size of the slowest changing dimension may differ.
+ * Each reference in the \p buf array belongs to the file identified
* by the corresponding object identifiers in the array \p loc_id_ref.
*
- * If \p path does not exist in \p loc_id then the function will
+ * If \p path does not exist in \p loc_id then the function will
* create the path specified by \p path automatically.
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -103,10 +94,10 @@
*
*/
H5_HLRDLL herr_t H5LRmake_dataset(hid_t loc_id,
- const char *path,
- hid_t type_id, const size_t buf_size,
- const hid_t *loc_id_ref,
- const hdset_reg_ref_t *buf);
+ const char *path,
+ hid_t type_id, const size_t buf_size,
+ const hid_t *loc_id_ref,
+ const hdset_reg_ref_t *buf);
/*-------------------------------------------------------------------------
*
@@ -119,49 +110,46 @@ H5_HLRDLL herr_t H5LRmake_dataset(hid_t loc_id,
* --------------------------------------------------------------------------
* \ingroup H5LR
*
- * \brief Creates an array of region references using an array of paths to
+ * \brief Creates an array of region references using an array of paths to
* datasets and an array of corresponding hyperslab descriptions.
*
* \param[in] obj_id File identifier for the HDF5 file containing
* the referenced regions or an object identifier
* for any object in that file
- * \param[in] num_elem Number of elements in the \p path and
- * \p buf arrays
- * \param[in] path Array of pointers to strings, which contain
- * the paths to the target datasets for the
- * region references
+ * \param[in] num_elem Number of elements in the \p path and \p buf arrays
+ * \param[in] path Array of pointers to strings, which contain
+ * the paths to the target datasets for the region references
* \param[in] block_coord Array of hyperslab coordinate
- * \param[out] buf Buffer for returning an array of region
- * references
+ * \param[out] buf Buffer for returning an array of region references
*
* \return \herr_t
*
* \note **Motivation:**
- * \note H5LRcreate_region_references() is useful when creating
+ * \note H5LRcreate_region_references() is useful when creating
* large numbers of similar region references.
*
- * \details H5LRcreate_region_references() creates a list of region references
- * given an array of paths to datasets and another array listing the
+ * \details H5LRcreate_region_references() creates a list of region references
+ * given an array of paths to datasets and another array listing the
* corner coordinates of the corresponding hyperslabs.
*
* \p path parameter is an array of pointers to strings.
*
- * \p num_elem specifies the number of region references to be created,
+ * \p num_elem specifies the number of region references to be created,
* thus specifying the size of the \p path and \p _buf arrays.
*
- * Buffer \p block_coord has size 2*rank and is the coordinates of the
- * starting point following by the coordinates of the ending point of
- * the hyperslab, repeated \p num_elem times for each hyperslab.
- * For example, creating two region references to two hyperslabs,
- * one with a rectangular hyperslab region starting at element (2,2)
- * to element (5,4) and the second rectangular region starting at
- * element (7,7) to element (9,10), results in \p block_coord
+ * Buffer \p block_coord has size 2*rank and is the coordinates of the
+ * starting point following by the coordinates of the ending point of
+ * the hyperslab, repeated \p num_elem times for each hyperslab.
+ * For example, creating two region references to two hyperslabs,
+ * one with a rectangular hyperslab region starting at element (2,2)
+ * to element (5,4) and the second rectangular region starting at
+ * element (7,7) to element (9,10), results in \p block_coord
* being {2,2,5,4, 7,7,9,10}.
*
- * The rank of the hyperslab will be the same as the rank of the
- * target dataset. H5LRcreate_region_references() will retrieve
- * the rank for each dataset and will use those values to interpret
- * the values in the buffer. Please note that rank may vary from one
+ * The rank of the hyperslab will be the same as the rank of the
+ * target dataset. H5LRcreate_region_references() will retrieve
+ * the rank for each dataset and will use those values to interpret
+ * the values in the buffer. Please note that rank may vary from one
* dataset to another.
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -170,43 +158,39 @@ H5_HLRDLL herr_t H5LRmake_dataset(hid_t loc_id,
*
*/
H5_HLRDLL herr_t H5LRcreate_region_references(hid_t obj_id,
- size_t num_elem,
- const char **path,
- const hsize_t *block_coord,
- hdset_reg_ref_t *buf);
+ size_t num_elem,
+ const char **path,
+ const hsize_t *block_coord,
+ hdset_reg_ref_t *buf);
/**
* --------------------------------------------------------------------------
* \ingroup H5LR
*
- * \brief Copies data from the specified dataset to a new location and
- * creates a reference to it.
+ * \brief Copies data from the specified dataset to a new location and creates a reference to it.
*
- * \param[in] obj_id Identifier of any object in a file an
- * HDF5 reference belongs to
+ * \param[in] obj_id Identifier of any object in a file an HDF5 reference belongs to
* \param[in] ref Reference to the datasets region
- * \param[in] file Name of the destination file
+ * \param[in] file Name of the destination file
* \param[in] path Full path to the destination dataset
- * \param[in] block_coord Hyperslab coordinates in the destination
- * dataset
- * \param[out] ref_new Region reference to the new location of
- * data
+ * \param[in] block_coord Hyperslab coordinates in the destination dataset
+ * \param[out] ref_new Region reference to the new location of data
*
* \return \herr_t
*
- * \details Given a data set pointed to by a region reference, the function
- * H5LRcopy_reference() will copy the hyperslab data referenced by
- * a datasets region reference into existing dataset specified by
- * its path \p path in the file with the name \p file, and to location
- * specified by the hyperslab coordinates \p block_coord. It will
- * create the region reference \p ref_new to point to the new location.
- * The number of elements in the old and newly specified regions has
+ * \details Given a data set pointed to by a region reference, the function
+ * H5LRcopy_reference() will copy the hyperslab data referenced by
+ * a datasets region reference into existing dataset specified by
+ * its path \p path in the file with the name \p file, and to location
+ * specified by the hyperslab coordinates \p block_coord. It will
+ * create the region reference \p ref_new to point to the new location.
+ * The number of elements in the old and newly specified regions has
* to be the same.
*
- * Buffer \p block_coord has size 2*rank and is the coordinates of
- * the starting point following by the coordinates of the ending
- * point of the hyperslab. For example, to extract a rectangular
- * hyperslab region starting at element (2,2) to element (5,4)
+ * Buffer \p block_coord has size 2*rank and is the coordinates of
+ * the starting point following by the coordinates of the ending
+ * point of the hyperslab. For example, to extract a rectangular
+ * hyperslab region starting at element (2,2) to element (5,4)
* then \p block_coord would be {2, 2, 5, 4}.
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -215,41 +199,39 @@ H5_HLRDLL herr_t H5LRcreate_region_references(hid_t obj_id,
*
*/
H5_HLRDLL herr_t H5LRcopy_reference(hid_t obj_id, hdset_reg_ref_t *ref, const char *file,
- const char *path, const hsize_t *block_coord,
- hdset_reg_ref_t *ref_new);
+ const char *path, const hsize_t *block_coord,
+ hdset_reg_ref_t *ref_new);
/**
* --------------------------------------------------------------------------
* \ingroup H5LR
*
- * \brief Copies data from a referenced region to a region in a
- * destination dataset.
+ * \brief Copies data from a referenced region to a region in a destination dataset.
*
- * \param[in] obj_id Identifier of any object in a file
+ * \param[in] obj_id Identifier of any object in a file
* dataset region reference belongs to
* \param[in] ref Dataset region reference
- * \param[in] file Name of the destination file
+ * \param[in] file Name of the destination file
* \param[in] path Full path to the destination dataset
- * \param[in] block_coord Hyperslab coordinates in the destination
- * dataset
+ * \param[in] block_coord Hyperslab coordinates in the destination dataset
*
* \return \herr_t
*
- * \details Given a dataset region reference \p ref in a source file
- * specified by an identifier of any object in that file
- * \p obj_id, the function will write data to the existing
- * dataset \p path in file \p file to the simple hyperslab
+ * \details Given a dataset region reference \p ref in a source file
+ * specified by an identifier of any object in that file
+ * \p obj_id, the function will write data to the existing
+ * dataset \p path in file \p file to the simple hyperslab
* specified by \p block_coord.
*
- * Buffer \p block_coord has size 2*rank and is the coordinates
- * of the starting point following by the coordinates of the
- * ending point of the hyperslab. For example, to specify a
- * rectangular hyperslab destination region starting at element
+ * Buffer \p block_coord has size 2*rank and is the coordinates
+ * of the starting point following by the coordinates of the
+ * ending point of the hyperslab. For example, to specify a
+ * rectangular hyperslab destination region starting at element
* (2,2) to element (5,4) then \p block_coord would be {2, 2, 5, 4}.
*
- * If \p path does not exist in the destination file (as may be
- * the case when writing to a new file) then the dataset will be
- * copied directly to the \p path and \p block_coord will be
+ * If \p path does not exist in the destination file (as may be
+ * the case when writing to a new file) then the dataset will be
+ * copied directly to the \p path and \p block_coord will be
* disregarded.
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -258,71 +240,66 @@ H5_HLRDLL herr_t H5LRcopy_reference(hid_t obj_id, hdset_reg_ref_t *ref, const ch
*
*/
H5_HLRDLL herr_t H5LRcopy_region(hid_t obj_id,
- hdset_reg_ref_t *ref,
- const char *file,
- const char *path,
- const hsize_t *block_coord);
+ hdset_reg_ref_t *ref,
+ const char *file,
+ const char *path,
+ const hsize_t *block_coord);
/**
* --------------------------------------------------------------------------
* \ingroup H5LR
*
- * \brief Creates a dataset with the region references to the data
- * in all datasets located under a specified group in a file
- * or creates a dataset with object references to all objects
+ * \brief Creates a dataset with the region references to the data
+ * in all datasets located under a specified group in a file
+ * or creates a dataset with object references to all objects
* (groups or datasets) located under a specified group in a file.
*
* \fg_loc_id
- * \param[in] group_path Absolute or relative path to the group
- * at which traversal starts
- * \param[in] ds_path Absolute or relative path to the dataset
- * with region references to be created
- * \param[in] index_type Index_type;
- * see valid values below in description
- * \param[in] order Order in which index is traversed;
- * see valid values below in description
- * \param[in] ref_type Reference type;
- * see valid values below in description
+ * \param[in] group_path Absolute or relative path to the group at which traversal starts
+ * \param[in] ds_path Absolute or relative path to the dataset with region references to be created
+ * \param[in] index_type Index_type; see valid values below in description
+ * \param[in] order Order in which index is traversed; see valid values below in description
+ * \param[in] ref_type Reference type; see valid values below in description
*
* \return \herr_t
*
- * \details H5LRcreate_ref_to_all() creates a dataset with the
- * region references to the data in all datasets located
- * under a specified group in a file or creates a dataset with
- * object references to all objects (groups or datasets) located
+ * \details H5LRcreate_ref_to_all() creates a dataset with the
+ * region references to the data in all datasets located
+ * under a specified group in a file or creates a dataset with
+ * object references to all objects (groups or datasets) located
* under a specified group in a file.
*
- * Given a dataset path \p ds_path in a file specified by the
- * \p loc_id identifier, the function H5LRcreate_ref_to_all()
- * will create a contiguous one-dimensional dataset with the
- * region references or object references depending on the value
- * of the \p ref_type parameter. When \p ref_type is
- * #H5R_DATASET_REGION, each region reference points to all data
- * in a dataset encountered by an internally called H5Lvisit()
- * routine, which starts at the group specified by the \p loc_id
+ * Given a dataset path \p ds_path in a file specified by the
+ * \p loc_id identifier, the function H5LRcreate_ref_to_all()
+ * will create a contiguous one-dimensional dataset with the
+ * region references or object references depending on the value
+ * of the \p ref_type parameter. When \p ref_type is
+ * #H5R_DATASET_REGION, each region reference points to all data
+ * in a dataset encountered by an internally called H5Lvisit()
+ * routine, which starts at the group specified by the \p loc_id
* and \p group_path parameters. In a like manner, when
- * \p ref_type is #H5R_OBJECT, each object reference points to
+ * \p ref_type is #H5R_OBJECT, each object reference points to
* an object (a group or a dataset) encountered by H5Lvisit().
*
- * If \p ds_path does not exist in \p loc_id then the function
+ * If \p ds_path does not exist in \p loc_id then the function
* will create the path specified by \p ds_path automatically.
*
- * \p index_type specifies the index to be used.
+ * \p index_type specifies the index to be used.
* Valid values include the following:
* - #H5_INDEX_NAME Alphanumeric index on name
* - #H5_INDEX_CRT_ORDER Index on creation order
*
- * \p order specifies the order in which objects are to be
- * inspected along the index specified in \p index_type.
+ * \p order specifies the order in which objects are to be
+ * inspected along the index specified in \p index_type.
* Valid values include the following:
* - #H5_ITER_INC Increasing order
* - #H5_ITER_DEC Decreasing order
* - #H5_ITER_NATIVE Fastest available order
*
- * For more detailed information on these two parameters,
- * see H5Lvisit().
+ * For more detailed information on these two parameters,
+ * @see H5Lvisit().
*
- * \p ref_type specifies the type of the reference to be used.
+ * \p ref_type specifies the type of the reference to be used.
* Valid values include the following:
* - #H5R_DATASET_REGION Dataset region reference
* - #H5R_OBJECT Object reference
@@ -333,7 +310,7 @@ H5_HLRDLL herr_t H5LRcopy_region(hid_t obj_id,
*
*/
H5_HLRDLL herr_t H5LRcreate_ref_to_all(hid_t loc_id, const char *group_path,
- const char *ds_path, H5_index_t index_type, H5_iter_order_t order, H5R_type_t ref_type);
+ const char *ds_path, H5_index_t index_type, H5_iter_order_t order, H5R_type_t ref_type);
/*-------------------------------------------------------------------------
*
@@ -352,30 +329,27 @@ H5_HLRDLL herr_t H5LRcreate_ref_to_all(hid_t loc_id, const char *group_path,
* \param[in] obj_id File identifier for the HDF5 file containing
* the dataset with the referenced region or an
* object identifier for any object in that file
- * \param[in] ref Region reference specifying data to be read
- * in
- * \param[in] mem_type Memory datatype of data read from referenced
+ * \param[in] ref Region reference specifying data to be read in
+ * \param[in] mem_type Memory datatype of data read from referenced
* region into the application buffer
- * \param[in,out] numelem Number of elements to be read into buffer
- * \p buf
- * \param[out] buf Buffer in which data is returned to the
- * application
+ * \param[in,out] numelem Number of elements to be read into buffer \p buf
+ * \param[out] buf Buffer in which data is returned to the application
*
* \return \herr_t
*
- * \details H5LRread_region() reads data pointed to by the region
+ * \details H5LRread_region() reads data pointed to by the region
* reference \p ref into the buffer \p buf.
*
- * \p numelem specifies the number of elements to be read
- * into \p buf. When the size of the reference region is unknown,
- * H5LRread_region() can be called with \p buf set to NULL;
- * the number of elements in the referenced region will be returned
+ * \p numelem specifies the number of elements to be read
+ * into \p buf. When the size of the reference region is unknown,
+ * H5LRread_region() can be called with \p buf set to NULL;
+ * the number of elements in the referenced region will be returned
* in \p numelem.
*
- * The buffer buf must be big enough to hold \p numelem elements
- * of type \p mem_type. For example, if data is read from the referenced
- * region into an integer buffer, \p mem_type should be #H5T_NATIVE_INT
- * and the buffer must be at least \c sizeof(int) * \p numelem bytes
+ * The buffer buf must be big enough to hold \p numelem elements
+ * of type \p mem_type. For example, if data is read from the referenced
+ * region into an integer buffer, \p mem_type should be #H5T_NATIVE_INT
+ * and the buffer must be at least \c sizeof(int) * \p numelem bytes
* in size. This buffer must be allocated by the application.
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -384,10 +358,10 @@ H5_HLRDLL herr_t H5LRcreate_ref_to_all(hid_t loc_id, const char *group_path,
*
*/
H5_HLRDLL herr_t H5LRread_region(hid_t obj_id,
- const hdset_reg_ref_t *ref,
- hid_t mem_type,
- size_t *numelem,
- void *buf );
+ const hdset_reg_ref_t *ref,
+ hid_t mem_type,
+ size_t *numelem,
+ void *buf );
/*-------------------------------------------------------------------------
*
@@ -400,40 +374,33 @@ H5_HLRDLL herr_t H5LRread_region(hid_t obj_id,
* --------------------------------------------------------------------------
* \ingroup H5LR
*
- * \brief Retrieves information about the data a region reference
- * points to.
+ * \brief Retrieves information about the data a region reference points to.
*
- * \param[in] obj_id Identifier of any object in an HDF5 file
- * the region reference belongs to.
+ * \param[in] obj_id Identifier of any object in an HDF5 file the region reference belongs to.
* \param[in] ref Region reference to query
- * \param[in,out] len Size of the buffer to store \p path in.
- * NOTE: if \p *path is not NULL then \p *len
- * must be the appropriate length
+ * \param[in,out] len Size of the buffer to store \p path in.
+ * NOTE: if \p *path is not NULL then \p *len must be the appropriate length
* \param[out] path Full path that a region reference points to
* \param[out] rank The number of dimensions of the dataset
- * dimensions of the dataset pointed by
- * region reference.
- * \param[out] dtype Datatype of the dataset pointed by the
- * region reference.
+ * dimensions of the dataset pointed by region reference.
+ * \param[out] dtype Datatype of the dataset pointed by the region reference.
* \param[out] sel_type Type of the selection (point or hyperslab)
- * \param[in,out] numelem Number of coordinate blocks or
- * selected elements.
- * \param[out] buf Buffer containing description of the region
- * pointed by region reference
+ * \param[in,out] numelem Number of coordinate blocks or selected elements.
+ * \param[out] buf Buffer containing description of the region pointed by region reference
*
* \return \herr_t
*
- * \details H5LRget_region_info() queries information about the data
- * pointed by a region reference \p ref. It returns one of the
- * absolute paths to a dataset, length of the path, dataset’s rank
- * and datatype, description of the referenced region and type of
- * the referenced region. Any output argument can be NULL if that
+ * \details H5LRget_region_info() queries information about the data
+ * pointed by a region reference \p ref. It returns one of the
+ * absolute paths to a dataset, length of the path, dataset’s rank
+ * and datatype, description of the referenced region and type of
+ * the referenced region. Any output argument can be NULL if that
* argument does not need to be returned.
*
- * The parameter \p obj_id is an identifier for any object in the
- * HDF5 file containing the referenced object. For example, it can
- * be an identifier of a dataset the region reference belongs to
- * or an identifier of an HDF5 file the dataset with region references
+ * The parameter \p obj_id is an identifier for any object in the
+ * HDF5 file containing the referenced object. For example, it can
+ * be an identifier of a dataset the region reference belongs to
+ * or an identifier of an HDF5 file the dataset with region references
* is stored in.
*
* The parameter \p ref is a region reference to query.
@@ -442,36 +409,36 @@ H5_HLRDLL herr_t H5LRread_region(hid_t obj_id,
* buffer of size \p len+1 to return an absolute path to a dataset
* the region reference points to.
*
- * The parameter \p len is a length of absolute path string plus
- * the \0 string terminator. If path parameter is NULL, actual
- * length of the path (+1 for \0 string terminator) is returned to
- * application and can be used to allocate buffer path of an
+ * The parameter \p len is a length of absolute path string plus
+ * the \0 string terminator. If path parameter is NULL, actual
+ * length of the path (+1 for \0 string terminator) is returned to
+ * application and can be used to allocate buffer path of an
* appropriate length \p len.
*
* The parameter \p sel_type describes the type of the selected
- * region. Possible values can be #H5S_SEL_POINTS for point
+ * region. Possible values can be #H5S_SEL_POINTS for point
* selection and #H5S_SEL_HYPERSLABS for hyperslab selection.
*
- * The parameter \p numelem describes how many elements will be
- * placed in the buffer \p buf. The number should be interpreted
+ * The parameter \p numelem describes how many elements will be
+ * placed in the buffer \p buf. The number should be interpreted
* using the value of \p sel_type.
*
- * If value of \p sel_type is #H5S_SEL_HYPERSLABS, the parameter
- * \p buf contains \p numelem blocks of the coordinates for each
- * simple hyperslab of the referenced region. Each block has
- * length \c 2*\p rank and is organized as follows: <"start" coordinate>,
- * immediately followed by <"opposite" corner coordinate>.
- * The total size of the buffer to hold the description of the
- * region will be \c 2*\p rank*\p numelem. If region reference
- * points to a contiguous sub-array, then the value of \p numelem
- * is 1 and the block contains coordinates of the upper left and
+ * If value of \p sel_type is #H5S_SEL_HYPERSLABS, the parameter
+ * \p buf contains \p numelem blocks of the coordinates for each
+ * simple hyperslab of the referenced region. Each block has
+ * length \c 2*\p rank and is organized as follows: <"start" coordinate>,
+ * immediately followed by <"opposite" corner coordinate>.
+ * The total size of the buffer to hold the description of the
+ * region will be \c 2*\p rank*\p numelem. If region reference
+ * points to a contiguous sub-array, then the value of \p numelem
+ * is 1 and the block contains coordinates of the upper left and
* lower right corners of the sub-array (or simple hyperslab).
*
- * If value of \p sel_type is #H5S_SEL_POINTS, the parameter \p buf
- * contains \p numelem blocks of the coordinates for each selected
- * point of the referenced region. Each block has length \p rank
- * and contains coordinates of the element. The total size of the
- * buffer to hold the description of the region will be
+ * If value of \p sel_type is #H5S_SEL_POINTS, the parameter \p buf
+ * contains \p numelem blocks of the coordinates for each selected
+ * point of the referenced region. Each block has length \p rank
+ * and contains coordinates of the element. The total size of the
+ * buffer to hold the description of the region will be
* \p rank* \p numelem.
*
*
@@ -481,14 +448,14 @@ H5_HLRDLL herr_t H5LRread_region(hid_t obj_id,
*
*/
H5_HLRDLL herr_t H5LRget_region_info(hid_t obj_id,
- const hdset_reg_ref_t *ref,
- size_t *len,
- char *path,
- int *rank,
- hid_t *dtype,
- H5S_sel_type *sel_type,
- size_t *numelem,
- hsize_t *buf );
+ const hdset_reg_ref_t *ref,
+ size_t *len,
+ char *path,
+ int *rank,
+ hid_t *dtype,
+ H5S_sel_type *sel_type,
+ size_t *numelem,
+ hsize_t *buf );
@@ -503,35 +470,33 @@ H5_HLRDLL herr_t H5LRget_region_info(hid_t obj_id,
* --------------------------------------------------------------------------
* \ingroup H5LR
*
- * \brief Copies data from a specified region in a source dataset
+ * \brief Copies data from a specified region in a source dataset
* to a specified region in a destination dataset
*
* \param[in] file_src Name of the source file
* \param[in] path_src Full path to the source dataset
- * \param[in] block_coord_src Hyperslab coordinates in the
- * source dataset
+ * \param[in] block_coord_src Hyperslab coordinates in the source dataset
* \param[in] file_dest Name of the destination file
* \param[in] path_dest Full path to the destination dataset
- * \param[in] block_coord_dset Hyperslab coordinates in the
- * destination dataset
+ * \param[in] block_coord_dset Hyperslab coordinates in the destination dataset
*
* \return \herr_t
*
- * \details Given a path to a dataset \p path_src in a file with the
- * name \p file_src, and description of a simple hyperslab of
- * the source \p block_coord_src, the function will write data
- * to the dataset \p path_dest in file \p file_dest to the
- * simple hyperslab specified by \p block_coord_dset.
- * The arrays \p block_coord_src and \p block_coord_dset have
- * a length of 2*rank and are the coordinates of the starting
- * point following by the coordinates of the ending point of the
- * hyperslab. For example, to specify a rectangular hyperslab
- * destination region starting at element (2,2) to element (5,4)
+ * \details Given a path to a dataset \p path_src in a file with the
+ * name \p file_src, and description of a simple hyperslab of
+ * the source \p block_coord_src, the function will write data
+ * to the dataset \p path_dest in file \p file_dest to the
+ * simple hyperslab specified by \p block_coord_dset.
+ * The arrays \p block_coord_src and \p block_coord_dset have
+ * a length of 2*rank and are the coordinates of the starting
+ * point following by the coordinates of the ending point of the
+ * hyperslab. For example, to specify a rectangular hyperslab
+ * destination region starting at element (2,2) to element (5,4)
* then \p block_coord_dset would be {2, 2, 5, 4}.
*
- * If \p path_dest does not exist in the destination file
- * (as may be the case when writing to a new file) then the
- * dataset will be copied directly to the \p path_dest and
+ * If \p path_dest does not exist in the destination file
+ * (as may be the case when writing to a new file) then the
+ * dataset will be copied directly to the \p path_dest and
* \p block_coord_dset will be disregarded.
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -540,11 +505,11 @@ H5_HLRDLL herr_t H5LRget_region_info(hid_t obj_id,
*
*/
H5_HLRDLL herr_t H5LTcopy_region(const char *file_src,
- const char *path_src,
- const hsize_t *block_coord_src,
- const char *file_dest,
- const char *path_dest,
- const hsize_t *block_coord_dset);
+ const char *path_src,
+ const hsize_t *block_coord_src,
+ const char *file_dest,
+ const char *path_dest,
+ const hsize_t *block_coord_dset);
/*-------------------------------------------------------------------------
*
@@ -562,27 +527,25 @@ H5_HLRDLL herr_t H5LTcopy_region(const char *file_src,
* \param[in] file Name of file
* \param[in] path Full path to a dataset
* \param[in] block_coord Hyperslab coordinates
- * \param[in] mem_type Memory datatype, describing the buffer
- * the referenced data will be read into
- * \param[out] buf Buffer containing data from the
- * referenced region
+ * \param[in] mem_type Memory datatype, describing the buffer the referenced data will be read into
+ * \param[out] buf Buffer containing data from the referenced region
*
* \return \herr_t
*
- * \details H5LTread_region() reads data from a region described by
- * the hyperslab coordinates in \p block_coord, located in
- * the dataset specified by its absolute path \p path in a
- * file specified by its name \p file. Data is read into a
- * buffer \p buf of the datatype that corresponds to the
+ * \details H5LTread_region() reads data from a region described by
+ * the hyperslab coordinates in \p block_coord, located in
+ * the dataset specified by its absolute path \p path in a
+ * file specified by its name \p file. Data is read into a
+ * buffer \p buf of the datatype that corresponds to the
* HDF5 datatype specified by \p mem_type.
*
- * Buffer \p block_coord has size 2*rank and is the coordinates
- * of the starting point following by the coordinates of the
- * ending point of the hyperslab. For example, to extract a
- * rectangular hyperslab region starting at element (2,2) to
+ * Buffer \p block_coord has size 2*rank and is the coordinates
+ * of the starting point following by the coordinates of the
+ * ending point of the hyperslab. For example, to extract a
+ * rectangular hyperslab region starting at element (2,2) to
* element (5,4) then \p block_coord would be {2, 2, 5, 4}.
*
- * Buffer \p buf should be big enough to hold selected elements
+ * Buffer \p buf should be big enough to hold selected elements
* of the type that corresponds to the \p mem_type
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -591,57 +554,55 @@ H5_HLRDLL herr_t H5LTcopy_region(const char *file_src,
*
*/
H5_HLRDLL herr_t H5LTread_region(const char *file,
- const char *path,
- const hsize_t *block_coord,
- hid_t mem_type,
- void *buf );
+ const char *path,
+ const hsize_t *block_coord,
+ hid_t mem_type,
+ void *buf );
/**
* --------------------------------------------------------------------------
* \ingroup H5LR
*
- * \brief Retrieves the values of quality flags for each element
+ * \brief Retrieves the values of quality flags for each element
* to the application provided buffer.
*
* \param[in] dset_id Identifier of the dataset with bit-field values
* \param[in] num_values Number of the values to be extracted
- * \param[in] offset Array of staring bits to be extracted from
+ * \param[in] offset Array of staring bits to be extracted from
* the element; valid values: 0 (zero) through 7
- * \param[in] lengths Array of the number of bits to be extracted
- * for each value
- * \param[in] space Dataspace identifier, describing the elements
- * to be read from the dataset with bit-field
- * values
+ * \param[in] lengths Array of the number of bits to be extracted for each value
+ * \param[in] space Dataspace identifier, describing the elements
+ * to be read from the dataset with bit-field values
* \param[out] buf Buffer to read the values in
*
* \return \herr_t
*
- * \details H5LTread_bitfield_value() reads selected elements from a
- * dataset specified by its identifier \p dset_id, and unpacks
+ * \details H5LTread_bitfield_value() reads selected elements from a
+ * dataset specified by its identifier \p dset_id, and unpacks
* the bit-field values to a buffer \p buf.
*
- * The parameter \p space is a space identifier that indicates
+ * The parameter \p space is a space identifier that indicates
* which elements of the dataset should be read.
*
- * The parameter \p offset is an array of length \p num_values;
+ * The parameter \p offset is an array of length \p num_values;
* the i<sup>th</sup> element of the array holds the value of the
- * starting bit of the i<sup>th</sup> bit-field value.
+ * starting bit of the i<sup>th</sup> bit-field value.
* Valid values are: 0 (zero) through 7.
*
- * The parameter \p lengths is an array of length \p num_values;
- * the i<sup>th</sup> element of the array holds the number of
- * bits to be extracted for the i<sup>th</sup> bit-field value.
- * Extracted bits will be interpreted as a base-2 integer value.
- * Each value will be converted to the base-10 integer value and
- * stored in the application buffer.
- *
- * Buffer \p buf is allocated by the application and should be big
- * enough to hold \c num_sel_elem * \p num_values elements of the
- * specified type, where \c num_sel_elem is a number of the elements
- * to be read from the dataset. Data in the buffer is organized
- * as \p num_values values for the first element, followed by the
- * \p num_values values for the second element, ... , followed by
- * the \p num_values values for the
+ * The parameter \p lengths is an array of length \p num_values;
+ * the i<sup>th</sup> element of the array holds the number of
+ * bits to be extracted for the i<sup>th</sup> bit-field value.
+ * Extracted bits will be interpreted as a base-2 integer value.
+ * Each value will be converted to the base-10 integer value and
+ * stored in the application buffer.
+ *
+ * Buffer \p buf is allocated by the application and should be big
+ * enough to hold \c num_sel_elem * \p num_values elements of the
+ * specified type, where \c num_sel_elem is a number of the elements
+ * to be read from the dataset. Data in the buffer is organized
+ * as \p num_values values for the first element, followed by the
+ * \p num_values values for the second element, ... , followed by
+ * the \p num_values values for the
* \c num_selected_elem<sup>th</sup> element.
*
* \version 1.1 Fortran wrapper introduced in this release.
@@ -650,5 +611,5 @@ H5_HLRDLL herr_t H5LTread_region(const char *file,
*
*/
H5_HLRDLL herr_t H5LTread_bitfield_value(hid_t dset_id, int num_values, const unsigned *offset,
- const unsigned *lengths, hid_t space, int *buf);
+ const unsigned *lengths, hid_t space, int *buf);
diff --git a/doxygen/dox/high_level/high_level.dox b/doxygen/dox/high_level/high_level.dox
deleted file mode 100644
index c53d298..0000000
--- a/doxygen/dox/high_level/high_level.dox
+++ /dev/null
@@ -1,29 +0,0 @@
-/** \page high_level High-level library
- * The high-level HDF5 library includes several sets of convenience and standard-use APIs to
- * facilitate common HDF5 operations.
- *
- * <ul>
- * <li>\ref H5LT "Lite (H5LT, H5LD)"
- * \n
- * Functions to simplify creating and manipulating datasets, attributes and other features
- * <li>\ref H5IM "Image (H5IM)"
- * \n
- * Creating and manipulating HDF5 datasets intended to be interpreted as images
- * <li>\ref H5TB "Table (H5TB)"
- * \n
- * Creating and manipulating HDF5 datasets intended to be interpreted as tables
- * <li>\ref H5PT "Packet Table (H5PT)"
- * \n
- * Creating and manipulating HDF5 datasets to support append- and read-only operations on table data
- * <li>\ref H5DS "Dimension Scale (H5DS)"
- * \n
- * Creating and manipulating HDF5 datasets that are associated with the dimension of another HDF5 dataset
- * <li>\ref H5DO "Optimizations (H5DO)"
- * \n
- * Bypassing default HDF5 behavior in order to optimize for specific use cases
- * <li>\ref H5LR "Extensions (H5LR, H5LT)"
- * \n
- * Working with region references, hyperslab selections, and bit-fields
- * </ul>
- *
- */
diff --git a/doxygen/dox/rm-template.dox b/doxygen/dox/rm-template.dox
index bd81f64..1e9f2d7 100644
--- a/doxygen/dox/rm-template.dox
+++ b/doxygen/dox/rm-template.dox
@@ -96,4 +96,4 @@ the <a href="https://www.oreilly.com/library/view/97-things-every/9780596809515/
* \version 1.MAJOR.MINOR Function was deprecated in this release
\endverbatim
-*/ \ No newline at end of file
+*/
diff --git a/doxygen/examples/H5.format.1.0.html b/doxygen/examples/H5.format.1.0.html
index ff21315..4eb0548 100644
--- a/doxygen/examples/H5.format.1.0.html
+++ b/doxygen/examples/H5.format.1.0.html
@@ -139,7 +139,7 @@
<p>This document describes the lower-level data objects;
the higher-level objects and their properties are described
- in the <a href="H5.user.html"><cite>HDF5 User's Guide</cite></a>.
+ in the <a href="H5.user.html"><cite>HDF5 User Guide</cite></a>.
<!--
diff --git a/doxygen/examples/H5.format.1.1.html b/doxygen/examples/H5.format.1.1.html
index 0ae31df..9d03a76 100644
--- a/doxygen/examples/H5.format.1.1.html
+++ b/doxygen/examples/H5.format.1.1.html
@@ -172,7 +172,7 @@ TABLE.list TD { border:none; }
<p>This document describes the lower-level data objects;
the higher-level objects and their properties are described
- in the <a href="H5.user.html"><cite>HDF5 User's Guide</cite></a>.
+ in the <a href="H5.user.html"><cite>HDF5 User Guide</cite></a>.
<P>Three levels of information comprise the file format.
Level 0 contains basic information for identifying and
diff --git a/doxygen/examples/H5.format.2.0.html b/doxygen/examples/H5.format.2.0.html
index c16a3cc..d2979e1 100644
--- a/doxygen/examples/H5.format.2.0.html
+++ b/doxygen/examples/H5.format.2.0.html
@@ -1,289 +1,392 @@
<!DOCTYPE HTML>
<html>
- <head>
- <title>
- HDF5 File Format Specification Version 2.0
- </title>
-
-<style>
-h1 { display: block;
- margin-top: 24px;
- margin-bottom: 24px;
- margin-left: 0px;
- margin-right: 0px;
- text-indent: 0px;
- }
-
-h2 { display: block;
- margin-top: 8x;
- margin-bottom: 8px;
- margin-left: 0px;
- margin-right: 0px;
- text-indent: 0px;
- }
-<!-- A horizontal rule (<hr />) should be placed on the line above
+<head>
+<title>HDF5 File Format Specification Version 2.0</title>
+
+<style type="text/css">
+h1 {
+ display: block;
+ margin-top: 24px;
+ margin-bottom: 24px;
+ margin-left: 0px;
+ margin-right: 0px;
+ text-indent: 0px;
+}
+
+h2 {
+ display: block;
+ margin-top: 8x;
+ margin-bottom: 8px;
+ margin-left: 0px;
+ margin-right: 0px;
+ text-indent: 0px;
+}
+
+<!--
+A horizontal rule ( <hr />) should be placed on the line above
each h2 tag. The h2 tags are used on the main sections along with
-the hr tags. -->
-
-h3 { display: block;
- margin-top: 8px;
- margin-bottom: 8px;
- margin-left: 0px;
- margin-right: 0px;
- text-indent: 0px;
- }
-
-h4 { display: block;
- margin-top: 8px;
- margin-bottom: 8px;
- margin-left: 0px;
- margin-right: 0px;
- text-indent: 0px;
- }
-
-p { display: block;
+the hr tags. -->h3 {
+ display: block;
margin-top: 8px;
margin-bottom: 8px;
margin-left: 0px;
margin-right: 0px;
text-indent: 0px;
- }
+}
+
+h4 {
+ display: block;
+ margin-top: 8px;
+ margin-bottom: 8px;
+ margin-left: 0px;
+ margin-right: 0px;
+ text-indent: 0px;
+}
+
+p {
+ display: block;
+ margin-top: 8px;
+ margin-bottom: 8px;
+ margin-left: 0px;
+ margin-right: 0px;
+ text-indent: 0px;
+}
+
+<!--
+p.item {
+ margin-left: 2em;
+ text-indent: -2em
+}
+
+-->
<!--
-p.item { margin-left: 2em;
- text-indent: -2em
- } -->
-<!-- p.item2 { margin-left: 2em; text-indent: 2em} -->
-
-table.format { border:solid;
- border-collapse:collapse;
- caption-side:top;
- text-align:center;
- width:80%;
- }
-table.format th { border:ridge;
- padding:4px;
- width:25%;
- }
-table.format td { border:ridge;
- padding:4px;
- }
-table.format caption { font-weight:bold;
- font-size:larger;
- }
-
-table.note {border:none;
- text-align:right;
- width:80%;
- }
-
-table.desc { border:solid;
- border-collapse:collapse;
- caption-size:top;
- text-align:left;
- width:80%;
- }
-table.desc tr { vertical-align:top;
- }
-table.desc th { border-style:ridge;
- font-size:larger;
- padding:4px;
- <!-- text-decoration:underline; -->
- }
-table.desc td { border-style:ridge;
- <!-- padding: 4px; -->
- vertical-align:text-top;
- }
-table.desc caption { font-weight:bold;
- font-size:larger;
- }
-
-table.list { border:none;
- width:100%
- }
-table.list tr { vertical-align:text-top;
- }
-table.list th { border:none;
- text-decoration:underline;
- vertical-align:text-top;
- }
-table.list td { border:none;
- vertical-align:text-top;
- }
-
-table.msgdesc { border:none;
- text-align:left;
- width: 80%
- }
-table.msgdesc tr { vertical-align:text-top;
- border-spacing:0;
- padding:0; }
-table.msgdesc th { border:none;
- text-decoration:underline;
- vertical-align:text-top; }
-table.msgdesc td { border:none;
- vertical-align:text-top;
- }
-
-table.list80 { border:none;
- width:80%
- }
-table.list80 tr { vertical-align:text-top;
- }
-table.list80 th { border:none;
- text-decoration:underline;
- vertical-align:text-top;
- }
-table.list80 td { border:none;
- vertical-align:text-top;
- }
-
-table.glossary { border:none;
- text-align:left;
- width: 80%
- }
-table.glossary tr { vertical-align:text-top;
- border-spacing:0;
- padding:0; }
-table.glossary th { border:none;
- text-align:left;
- text-decoration:underline;
- vertical-align:text-top; }
-table.glossary td { border:none;
- text-align:left;
- vertical-align:text-top;
- }
-
-div { page-break-inside:avoid;
- page-break-after:auto
- }
+p.item2 {
+ margin-left: 2em;
+ text-indent: 2em
+}
+-->
+table.format {
+ border: solid;
+ border-collapse: collapse;
+ caption-side: top;
+ text-align: center;
+ width: 80%;
+}
+
+table.format th {
+ border: ridge;
+ padding: 4px;
+ width: 25%;
+}
+
+table.format td {
+ border: ridge;
+ padding: 4px;
+}
+
+table.format caption {
+ font-weight: bold;
+ font-size: larger;
+}
+
+table.note {
+ border: none;
+ text-align: right;
+ width: 80%;
+}
+
+table.desc {
+ border: solid;
+ border-collapse: collapse;
+ caption-size: top;
+ text-align: left;
+ width: 80%;
+}
+
+table.desc tr {
+ vertical-align: top;
+}
+
+table.desc th {
+ border-style: ridge;
+ font-size: larger;
+ padding: 4px; <!--
+ text-decoration: underline;
+ -->
+}
+
+table.desc td {
+ border-style: ridge; <!--
+ padding: 4px; -->
+ vertical-align: text-top;
+}
+
+table.desc caption {
+ font-weight: bold;
+ font-size: larger;
+}
+
+table.list {
+ border: none;
+ width: 100%
+}
+
+table.list tr {
+ vertical-align: text-top;
+}
+
+table.list th {
+ border: none;
+ text-decoration: underline;
+ vertical-align: text-top;
+}
+
+table.list td {
+ border: none;
+ vertical-align: text-top;
+}
+
+table.msgdesc {
+ border: none;
+ text-align: left;
+ width: 80%
+}
+
+table.msgdesc tr {
+ vertical-align: text-top;
+ border-spacing: 0;
+ padding: 0;
+}
+
+table.msgdesc th {
+ border: none;
+ text-decoration: underline;
+ vertical-align: text-top;
+}
+
+table.msgdesc td {
+ border: none;
+ vertical-align: text-top;
+}
+
+table.list80 {
+ border: none;
+ width: 80%
+}
+
+table.list80 tr {
+ vertical-align: text-top;
+}
+
+table.list80 th {
+ border: none;
+ text-decoration: underline;
+ vertical-align: text-top;
+}
+
+table.list80 td {
+ border: none;
+ vertical-align: text-top;
+}
+
+table.glossary {
+ border: none;
+ text-align: left;
+ width: 80%
+}
+
+table.glossary tr {
+ vertical-align: text-top;
+ border-spacing: 0;
+ padding: 0;
+}
+
+table.glossary th {
+ border: none;
+ text-align: left;
+ text-decoration: underline;
+ vertical-align: text-top;
+}
+
+table.glossary td {
+ border: none;
+ text-align: left;
+ vertical-align: text-top;
+}
+
+div {
+ page-break-inside: avoid;
+ page-break-after: auto
+}
</style>
- <center>
+<center>
<table border="0" width="90%">
- <tr>
- <td valign="top">
- <ol type="I">
- <li><a href="#Intro">Introduction</a></li>
- <font size="-1">
- <ol type="A">
- <li><a href="#ThisDocument">This Document</a></li>
- <li><a href="#ChangesForHdf5_1_10">Changes for HDF5 1.10</a></li>
- </ol>
- </font>
-
- <li><a href="#FileMetaData">Disk Format: Level 0 - File Metadata</a></li>
- <font size="-1">
- <ol type="A">
- <li><a href="#Superblock">Disk Format: Level 0A - Format Signature and Superblock</a></li>
- <li><a href="#DriverInfo">Disk Format: Level 0B - File Driver Info</a></li>
- <li><a href="#SuperblockExt">Disk Format: Level 0C - Superblock Extension</a></li>
- </ol>
- </font>
- <li><a href="#FileInfra">Disk Format: Level 1 - File Infrastructure</a></li>
- <font size="-1">
- <ol type="A">
- <li><a href="#Btrees">Disk Format: Level 1A - B-trees and B-tree
- Nodes</a></li>
- <ol type="1">
- <li><a href="#V1Btrees">Disk Format: Level 1A1 - Version 1
- B-trees (B-link Trees)</a></li>
- <li><a href="#V2Btrees">Disk Format: Level 1A2 - Version 2
- B-trees</a></li>
- </ol>
- <li><a href="#SymbolTable">Disk Format: Level 1B - Group Symbol Table Nodes</a></li>
- <li><a href="#SymbolTableEntry">Disk Format: Level 1C - Symbol Table Entry</a></li>
- <li><a href="#LocalHeap">Disk Format: Level 1D - Local Heaps</a></li>
- <li><a href="#GlobalHeap">Disk Format: Level 1E - Global Heap</a></li>
- <li><a href="#FractalHeap">Disk Format: Level 1F - Fractal Heap</a></li>
- <li><a href="#FreeSpaceManager">Disk Format: Level 1G - Free-space Manager</a></li>
- <li><a href="#SOHMTable">Disk Format: Level 1H - Shared Object Header Message Table</a></li>
- </ol>
- </font>
- <li><a href="#DataObject">Disk Format: Level 2 - Data Objects</a></li>
- <font size="-1">
- <ol type="A">
- <li><a href="#ObjectHeader">Disk Format: Level 2A - Data Object Headers</a></li>
- <ol type="1">
- <li><a href="#ObjectHeaderPrefix">Disk Format: Level 2A1 - Data Object Header Prefix</a></li>
- <ol type="a">
- <li><a href="#V1ObjectHeaderPrefix">Version 1 Data Object Header Prefix</a></li>
- <li><a href="#V2ObjectHeaderPrefix">Version 2 Data Object Header Prefix</a></li>
- </ol>
- <li><a href="#ObjectHeaderMessages">Disk Format: Level 2A2 - Data Object Header Messages</a></li>
- <ol type="a">
- <li><a href="#NILMessage">The NIL Message</a></li> <!-- 0x0000 -->
- <li><a href="#DataspaceMessage">The Dataspace Message</a></li> <!-- 0x0001 -->
- <li><a href="#LinkInfoMessage">The Link Info Message</a></li> <!-- 0x0002 -->
+ <tr>
+ <td valign="top">
+ <ol type="I">
+ <li><a href="#Intro">Introduction</a></li>
+ <font size="-1">
+ <ol type="A">
+ <li><a href="#ThisDocument">This Document</a></li>
+ <li><a href="#ChangesForHdf5_1_10">Changes for HDF5 1.10</a></li>
+ </ol>
+ </font>
+
+ <li><a href="#FileMetaData">Disk Format: Level 0 - File
+ Metadata</a></li>
+ <font size="-1">
+ <ol type="A">
+ <li><a href="#Superblock">Disk Format: Level 0A - Format
+ Signature and Superblock</a></li>
+ <li><a href="#DriverInfo">Disk Format: Level 0B - File
+ Driver Info</a></li>
+ <li><a href="#SuperblockExt">Disk Format: Level 0C -
+ Superblock Extension</a></li>
+ </ol>
+ </font>
+ <li><a href="#FileInfra">Disk Format: Level 1 - File
+ Infrastructure</a></li>
+ <font size="-1">
+ <ol type="A">
+ <li><a href="#Btrees">Disk Format: Level 1A - B-trees
+ and B-tree Nodes</a></li>
+ <ol type="1">
+ <li><a href="#V1Btrees">Disk Format: Level 1A1 -
+ Version 1 B-trees (B-link Trees)</a></li>
+ <li><a href="#V2Btrees">Disk Format: Level 1A2 -
+ Version 2 B-trees</a></li>
+ </ol>
+ <li><a href="#SymbolTable">Disk Format: Level 1B - Group
+ Symbol Table Nodes</a></li>
+ <li><a href="#SymbolTableEntry">Disk Format: Level 1C -
+ Symbol Table Entry</a></li>
+ <li><a href="#LocalHeap">Disk Format: Level 1D - Local
+ Heaps</a></li>
+ <li><a href="#GlobalHeap">Disk Format: Level 1E - Global
+ Heap</a></li>
+ <li><a href="#FractalHeap">Disk Format: Level 1F -
+ Fractal Heap</a></li>
+ <li><a href="#FreeSpaceManager">Disk Format: Level 1G -
+ Free-space Manager</a></li>
+ <li><a href="#SOHMTable">Disk Format: Level 1H - Shared
+ Object Header Message Table</a></li>
+ </ol>
+ </font>
+ <li><a href="#DataObject">Disk Format: Level 2 - Data
+ Objects</a></li>
+ <font size="-1">
+ <ol type="A">
+ <li><a href="#ObjectHeader">Disk Format: Level 2A - Data
+ Object Headers</a></li>
+ <ol type="1">
+ <li><a href="#ObjectHeaderPrefix">Disk Format: Level
+ 2A1 - Data Object Header Prefix</a></li>
+ <ol type="a">
+ <li><a href="#V1ObjectHeaderPrefix">Version 1 Data
+ Object Header Prefix</a></li>
+ <li><a href="#V2ObjectHeaderPrefix">Version 2 Data
+ Object Header Prefix</a></li>
+ </ol>
+ <li><a href="#ObjectHeaderMessages">Disk Format: Level
+ 2A2 - Data Object Header Messages</a></li>
+ <ol type="a">
+ <li><a href="#NILMessage">The NIL Message</a></li>
+ <!-- 0x0000 -->
+ <li><a href="#DataspaceMessage">The Dataspace Message</a></li>
+ <!-- 0x0001 -->
+ <li><a href="#LinkInfoMessage">The Link Info Message</a></li>
+ <!-- 0x0002 -->
+ </ol>
+ </ol>
+ </ol>
+ </font>
</ol>
- </ol>
- </ol>
- </font>
- </ol>
- </td>
-
- <td>&nbsp;</td>
-
- <td valign="top">
- <ol type="I" start="4">
- <li><a href="#DataObject">Disk Format: Level 2 - Data
- Objects</a><font size="-1"><i> (Continued)</i></li>
- <ol type="A">
- <li><a href="#ObjectHeader">Disk Format: Level 2A - Data Object
- Headers</a><i> (Continued)</i></li>
- <ol type="1" start="2">
- <li><a href="#ObjectHeaderMessages">Disk Format: Level 2A2 -
- Data Object Header Messages</a><i> (Continued)</i></li>
- <ol type="a" start="4">
- <li><a href="#DatatypeMessage">The Datatype Message</a></li> <!-- 0x0003 -->
- <li><a href="#OldFillValueMessage">The Data Storage -
- Fill Value (Old) Message</a></li> <!-- 0x0004 -->
- <li><a href="#FillValueMessage">The Data Storage -
- Fill Value Message</a></li> <!-- 0x0005 -->
- <li><a href="#LinkMessage">The Link Message</a></li> <!-- 0x0006 -->
- <li><a href="#ExternalFileListMessage">The Data Storage -
- External Data Files Message</a></li> <!-- 0x0007 -->
- <li><a href="#LayoutMessage">The Data Storage -
- Layout Message</a></li> <!-- 0x0008 -->
- <li><a href="#BogusMessage">The Bogus Message</a></li> <!-- 0x0009 -->
- <li><a href="#GroupInfoMessage">The Group Info
- Message</a></li> <!-- 0x000a -->
- <li><a href="#FilterMessage">The Data Storage -
- Filter Pipeline Message</a></li> <!-- 0x000b -->
- <li><a href="#AttributeMessage">The Attribute
- Message</a></li> <!-- 0x000c -->
- <li><a href="#CommentMessage">The Object Comment
- Message</a></li> <!-- 0x000d -->
- <li><a href="#OldModificationTimeMessage">The Object
- Modification Time (Old) Message</a></li> <!-- 0x000e -->
- <li><a href="#SOHMTableMessage">The Shared Message
- Table Message</a></li> <!-- 0x000f -->
- <li><a href="#ContinuationMessage">The Object Header
- Continuation Message</a></li> <!-- 0x0010 -->
- <li><a href="#SymbolTableMessage">The Symbol
- Table Message</a></li> <!-- 0x0011 -->
- <li><a href="#ModificationTimeMessage">The Object
- Modification Time Message</a></li> <!-- 0x0012 -->
- <li><a href="#BtreeKValuesMessage">The B-tree
- &lsquo;K&rsquo; Values Message</a></li> <!-- 0x0013 -->
- <li><a href="#DrvInfoMessage">The Driver Info
- Message</a></li> <!-- 0x0014 -->
- <li><a href="#AinfoMessage">The Attribute Info
- Message</a></li> <!-- 0x0015 -->
- <li><a href="#RefCountMessage">The Object Reference
- Count Message</a></li> <!-- 0x0016 -->
- <li><a href="#FsinfoMessage">The File Space Info
- Message</a></li> <!-- 0x0018 -->
+ </td>
+
+ <td>&nbsp;</td>
+
+ <td valign="top">
+ <ol type="I" start="4">
+ <li><a href="#DataObject">Disk Format: Level 2 - Data
+ Objects</a><font size="-1"><i> (Continued)</i></font></li>
+ <ol type="A">
+ <li><a href="#ObjectHeader">Disk Format: Level 2A - Data
+ Object Headers</a><i> (Continued)</i></li>
+ <ol type="1" start="2">
+ <li><a href="#ObjectHeaderMessages">Disk Format: Level
+ 2A2 - Data Object Header Messages</a><i> (Continued)</i></li>
+ <ol type="a" start="4">
+ <li><a href="#DatatypeMessage">The Datatype Message</a></li>
+ <!-- 0x0003 -->
+ <li><a href="#OldFillValueMessage">The Data Storage -
+ Fill Value (Old) Message</a></li>
+ <!-- 0x0004 -->
+ <li><a href="#FillValueMessage">The Data Storage - Fill
+ Value Message</a></li>
+ <!-- 0x0005 -->
+ <li><a href="#LinkMessage">The Link Message</a></li>
+ <!-- 0x0006 -->
+ <li><a href="#ExternalFileListMessage">The Data Storage
+ - External Data Files Message</a></li>
+ <!-- 0x0007 -->
+ <li><a href="#LayoutMessage">The Data Storage - Layout
+ Message</a></li>
+ <!-- 0x0008 -->
+ <li><a href="#BogusMessage">The Bogus Message</a></li>
+ <!-- 0x0009 -->
+ <li><a href="#GroupInfoMessage">The Group Info Message</a></li>
+ <!-- 0x000a -->
+ <li><a href="#FilterMessage">The Data Storage - Filter
+ Pipeline Message</a></li>
+ <!-- 0x000b -->
+ <li><a href="#AttributeMessage">The Attribute Message</a></li>
+ <!-- 0x000c -->
+ <li><a href="#CommentMessage">The Object Comment
+ Message</a></li>
+ <!-- 0x000d -->
+ <li><a href="#OldModificationTimeMessage">The Object
+ Modification Time (Old) Message</a></li>
+ <!-- 0x000e -->
+ <li><a href="#SOHMTableMessage">The Shared Message
+ Table Message</a></li>
+ <!-- 0x000f -->
+ <li><a href="#ContinuationMessage">The Object Header
+ Continuation Message</a></li>
+ <!-- 0x0010 -->
+ <li><a href="#SymbolTableMessage">The Symbol Table
+ Message</a></li>
+ <!-- 0x0011 -->
+ <li><a href="#ModificationTimeMessage">The Object
+ Modification Time Message</a></li>
+ <!-- 0x0012 -->
+ <li><a href="#BtreeKValuesMessage">The B-tree
+ &lsquo;K&rsquo; Values Message</a></li>
+ <!-- 0x0013 -->
+ <li><a href="#DrvInfoMessage">The Driver Info Message</a></li>
+ <!-- 0x0014 -->
+ <li><a href="#AinfoMessage">The Attribute Info Message</a></li>
+ <!-- 0x0015 -->
+ <li><a href="#RefCountMessage">The Object Reference
+ Count Message</a></li>
+ <!-- 0x0016 -->
+ <li><a href="#FsinfoMessage">The File Space Info
+ Message</a></li>
+ <!-- 0x0018 -->
+ </ol>
+ </ol>
+ <li><a href="#DataStorage">Disk Format: Level 2B - Data
+ Object Data Storage</a></li>
+ </ol>
+ <font></font>
+ <li><a href="#AppendixA">Appendix A: Definitions</a></li>
+ <li><a href="#AppendixB">Appendix B: File Memory
+ Allocation Types</a></li>
</ol>
- </ol>
- <li><a href="#DataStorage">Disk Format: Level 2B - Data Object Data Storage</a></li>
- </ol>
- </font>
- <li><a href="#AppendixA">Appendix A: Definitions</a></li>
- <li><a href="#AppendixB">Appendix B: File Memory Allocation Types</a></li>
- </ol>
-</td></tr>
-</table>
+ </td>
+ </tr>
+ </table>
</center>
@@ -293,949 +396,984 @@ div { page-break-inside:avoid;
<hr />
<a name="Intro"><h2>I. Introduction</h2></a>
- <table align="right" width="100">
- <tr><td>&nbsp;</td><td align="center">
- <hr />
- <img src="FF-IH_FileGroup.gif" alt="HDF5 Groups" hspace="15" vspace="15">
- </td><td>&nbsp;</td></tr>
- <tr><td>&nbsp;</td><td align="center">
- <strong>Figure 1:</strong> Relationships among the HDF5 root group, other groups, and objects
- <hr />
- </td><td>&nbsp;</td></tr>
-
- <tr><td>&nbsp;</td><td align="center">
- <img src="FF-IH_FileObject.gif" alt="HDF5 Objects" hspace="15" vspace="15">
- </td><td>&nbsp;</td></tr>
- <tr><td>&nbsp;</td><td align="center">
- <strong>Figure 2:</strong> HDF5 objects -- datasets, datatypes, or dataspaces
- <hr />
- </td><td>&nbsp;</td></tr>
- </table>
-
-
- <p>The format of an HDF5 file on disk encompasses several
- key ideas of the HDF4 and AIO file formats as well as
- addressing some shortcomings therein. The new format is
- more self-describing than the HDF4 format and is more
- uniformly applied to data objects in the file.</p>
-
- <p>An HDF5 file appears to the user as a directed graph.
- The nodes of this graph are the higher-level HDF5 objects
- that are exposed by the HDF5 APIs:</p>
-
- <ul>
- <li>Groups</li>
- <li>Datasets</li>
- <li>Committed (formerly Named) datatypes</li>
- </ul>
-
- <p>At the lowest level, as information is actually written to the disk,
- an HDF5 file is made up of the following objects:</p>
- <ul>
- <li>A superblock</li>
- <li>B-tree nodes</li>
- <li>Heap blocks</li>
- <li>Object headers</li>
- <li>Object data</li>
- <li>Free space</li>
- </ul>
-
- <p>The HDF5 Library uses these low-level objects to represent the
- higher-level objects that are then presented to the user or
- to applications through the APIs. For instance, a group is an
- object header that contains a message that points to a local
- heap (for storing the links to objects in the group) and to a
- B-tree (which indexes the links). A dataset is an object header
- that contains messages that describe datatype, dataspace, layout,
- filters, external files, fill value, and other elements with the
- layout message pointing to either a raw data chunk or to a
- B-tree that points to raw data chunks.</p>
+<table align="right" width="100">
+ <tr>
+ <td>&nbsp;</td>
+ <td align="center">
+ <hr /> <img src="FF-IH_FileGroup.gif" alt="HDF5 Groups" hspace="15"
+ vspace="15">
+ </td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td align="center"><strong>Figure 1:</strong> Relationships among
+ the HDF5 root group, other groups, and objects
+ <hr /></td>
+ <td>&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td>&nbsp;</td>
+ <td align="center"><img src="FF-IH_FileObject.gif"
+ alt="HDF5 Objects" hspace="15" vspace="15"></td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td align="center"><strong>Figure 2:</strong> HDF5 objects --
+ datasets, datatypes, or dataspaces
+ <hr /></td>
+ <td>&nbsp;</td>
+ </tr>
+</table>
+
+
+<p>The format of an HDF5 file on disk encompasses several key ideas
+ of the HDF4 and AIO file formats as well as addressing some
+ shortcomings therein. The new format is more self-describing than the
+ HDF4 format and is more uniformly applied to data objects in the file.</p>
+
+<p>An HDF5 file appears to the user as a directed graph. The nodes
+ of this graph are the higher-level HDF5 objects that are exposed by the
+ HDF5 APIs:</p>
+
+<ul>
+ <li>Groups</li>
+ <li>Datasets</li>
+ <li>Committed (formerly Named) datatypes</li>
+</ul>
+
+<p>At the lowest level, as information is actually written to the
+ disk, an HDF5 file is made up of the following objects:</p>
+<ul>
+ <li>A superblock</li>
+ <li>B-tree nodes</li>
+ <li>Heap blocks</li>
+ <li>Object headers</li>
+ <li>Object data</li>
+ <li>Free space</li>
+</ul>
+
+<p>The HDF5 Library uses these low-level objects to represent the
+ higher-level objects that are then presented to the user or to
+ applications through the APIs. For instance, a group is an object
+ header that contains a message that points to a local heap (for storing
+ the links to objects in the group) and to a B-tree (which indexes the
+ links). A dataset is an object header that contains messages that
+ describe datatype, dataspace, layout, filters, external files, fill
+ value, and other elements with the layout message pointing to either a
+ raw data chunk or to a B-tree that points to raw data chunks.</p>
<br />
<a name="ThisDocument"><h3>I.A. This Document</h3></a>
- <p>This document describes the lower-level data objects;
- the higher-level objects and their properties are described
- in the <a href="UG/HDF5_Users_Guide-Responsive HTML5/index.html"><cite>HDF5 User&rsquo;s Guide</cite></a>.</p>
-
- <p>Three levels of information comprise the file format.
- Level 0 contains basic information for identifying and
- defining information about the file. Level 1 information contains
- the information about the pieces of a file shared by many objects
- in the file (such as a B-trees and heaps). Level 2 is the rest
- of the file and contains all of the data objects, with each object
- partitioned into header information, also known as
- <em>metadata</em>, and data.</p>
-
- <p>The sizes of various fields in the following layout tables are
- determined by looking at the number of columns the field spans
- in the table. There are three exceptions: (1) The size may be
- overridden by specifying a size in parentheses, (2) the size of
- addresses is determined by the <em>Size of Offsets</em> field
- in the superblock and is indicated in this document with a
- superscripted &lsquo;O&rsquo;, and (3) the size of length fields is determined
- by the <em>Size of Lengths</em> field in the superblock and is
- indicated in this document with a superscripted &lsquo;L&rsquo;.</p>
-
- <p>Values for all fields in this document should be treated as unsigned
- integers, unless otherwise noted in the description of a field.
- Additionally, all metadata fields are stored in little-endian byte
- order.
- </p>
-
- <p>All checksums used in the format are computed with the
- <a href="http://www.burtleburtle.net/bob/hash/doobs.html">Jenkins&rsquo;
- lookup3</a> algorithm.
- </p>
-
- <p>Whenever a bit flag or field is mentioned for an entry, bits are
- numbered from the lowest bit position in the entry.
- </p>
-
- <p>Various tables in this document aligned with &ldquo;This space inserted
- only to align table nicely&rdquo;. These entries in the table are just
- to make the table presentation nicer and do not represent any values
- or padding in the file.
- </p>
+<p>
+ This document describes the lower-level data objects; the higher-level
+ objects and their properties are described in the <a
+ href="UG/HDF5_User_Guide-Responsive HTML5/index.html"><cite>HDF5
+ User Guide</cite></a>.
+</p>
+
+<p>
+ Three levels of information comprise the file format. Level 0 contains
+ basic information for identifying and defining information about the
+ file. Level 1 information contains the information about the pieces of
+ a file shared by many objects in the file (such as a B-trees and
+ heaps). Level 2 is the rest of the file and contains all of the data
+ objects, with each object partitioned into header information, also
+ known as <em>metadata</em>, and data.
+</p>
+
+<p>
+ The sizes of various fields in the following layout tables are
+ determined by looking at the number of columns the field spans in the
+ table. There are three exceptions: (1) The size may be overridden by
+ specifying a size in parentheses, (2) the size of addresses is
+ determined by the <em>Size of Offsets</em> field in the superblock and
+ is indicated in this document with a superscripted &lsquo;O&rsquo;, and
+ (3) the size of length fields is determined by the <em>Size of
+ Lengths</em> field in the superblock and is indicated in this document with
+ a superscripted &lsquo;L&rsquo;.
+</p>
+
+<p>Values for all fields in this document should be treated as
+ unsigned integers, unless otherwise noted in the description of a
+ field. Additionally, all metadata fields are stored in little-endian
+ byte order.</p>
+
+<p>
+ All checksums used in the format are computed with the <a
+ href="http://www.burtleburtle.net/bob/hash/doobs.html">Jenkins&rsquo;
+ lookup3</a> algorithm.
+</p>
+
+<p>Whenever a bit flag or field is mentioned for an entry, bits are
+ numbered from the lowest bit position in the entry.</p>
+
+<p>Various tables in this document aligned with &ldquo;This space
+ inserted only to align table nicely&rdquo;. These entries in the table
+ are just to make the table presentation nicer and do not represent any
+ values or padding in the file.</p>
<br />
<a name="ChangesForHdf5_1_10"><h3>I.B. Changes for HDF5 1.10</h3></a>
- <p>As of October 2015, changes in the file format for HDF5 1.10
- have not yet been finalized.</p>
+<p>As of October 2015, changes in the file format for HDF5 1.10 have
+ not yet been finalized.</p>
<br />
<br />
<hr />
-<h2><a name="FileMetaData">
-II. Disk Format: Level 0 - File Metadata</a></h2>
-
-<br />
-<h3><a name="Superblock">
-II.A. Disk Format: Level 0A - Format Signature and Superblock</a></h3>
-
- <p>The superblock may begin at certain predefined offsets within
- the HDF5 file, allowing a block of unspecified content for
- users to place additional information at the beginning (and
- end) of the HDF5 file without limiting the HDF5 Library&rsquo;s
- ability to manage the objects within the file itself. This
- feature was designed to accommodate wrapping an HDF5 file in
- another file format or adding descriptive information to an HDF5
- file without requiring the modification of the actual file&rsquo;s
- information. The superblock is located by searching for the
- HDF5 format signature at byte offset 0, byte offset 512, and at
- successive locations in the file, each a multiple of two of
- the previous location; in other words, at these byte offsets:
- 0, 512, 1024, 2048, and so on.</p>
-
- <p>The superblock is composed of the format signature, followed by a
- superblock version number and information that is specific to each
- version of the superblock.
- Currently, there are three versions of the superblock format.
- Version 0 is the default format, while version 1 is basically the same
- as version 0 with additional information when a non-default B-tree &lsquo;K&rsquo;
- value is stored. Version 2 is the latest format, with some fields
- eliminated or compressed and with superblock extension and checksum
- support.</p>
-
- <p>Version 0 and 1 of the superblock are described below:</p>
-
-
- <div align="center">
- <table class="format">
- <caption>
- Superblock (Versions 0 and 1)
- </caption>
-
- <tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />Format Signature (8 bytes)<br /><br /></td>
- </tr>
-
- <tr>
- <td>Version # of Superblock</td>
- <td>Version # of File&rsquo;s Free Space Storage</td>
- <td>Version # of Root Group Symbol Table Entry</td>
- <td>Reserved (zero)</td>
- </tr>
-
- <tr>
- <td>Version # of Shared Header Message Format</td>
- <td>Size of Offsets</td>
- <td>Size of Lengths</td>
- <td>Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="2">Group Leaf Node K</td>
- <td colspan="2">Group Internal Node K</td>
- </tr>
-
- <tr>
- <td colspan="4">File Consistency Flags</td>
- </tr>
-
- <tr>
- <td colspan="2" style="border:dotted;">Indexed Storage Internal Node K<sup>1</sup></td>
- <td colspan="2" style="border:dotted;">Reserved (zero)<sup>1</sup></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Base Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address of File Free space Info<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />End of File Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Driver Information Block Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Root Group Symbol Table Entry</td>
- </tr>
- </table>
+<h2>
+ <a name="FileMetaData"> II. Disk Format: Level 0 - File Metadata</a>
+</h2>
+
+<br />
+<h3>
+ <a name="Superblock"> II.A. Disk Format: Level 0A - Format
+ Signature and Superblock</a>
+</h3>
+
+<p>The superblock may begin at certain predefined offsets within the
+ HDF5 file, allowing a block of unspecified content for users to place
+ additional information at the beginning (and end) of the HDF5 file
+ without limiting the HDF5 Library&rsquo;s ability to manage the objects
+ within the file itself. This feature was designed to accommodate
+ wrapping an HDF5 file in another file format or adding descriptive
+ information to an HDF5 file without requiring the modification of the
+ actual file&rsquo;s information. The superblock is located by searching
+ for the HDF5 format signature at byte offset 0, byte offset 512, and at
+ successive locations in the file, each a multiple of two of the
+ previous location; in other words, at these byte offsets: 0, 512, 1024,
+ 2048, and so on.</p>
+
+<p>The superblock is composed of the format signature, followed by a
+ superblock version number and information that is specific to each
+ version of the superblock. Currently, there are three versions of the
+ superblock format. Version 0 is the default format, while version 1 is
+ basically the same as version 0 with additional information when a
+ non-default B-tree &lsquo;K&rsquo; value is stored. Version 2 is the
+ latest format, with some fields eliminated or compressed and with
+ superblock extension and checksum support.</p>
+
+<p>Version 0 and 1 of the superblock are described below:</p>
+
+
+<div align="center">
+ <table class="format">
+ <caption>Superblock (Versions 0 and 1)</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are
- of the size specified in &ldquo;Size of Offsets.&rdquo;)
- </td></tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
+
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with a &lsquo;1&rsquo; in the above table are
- new in version 1 of the superblock)
- </td></tr>
- </table>
- </div>
+ <td colspan="4"><br />Format Signature (8 bytes)<br />
+ <br /></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Format Signature</p></td>
- <td><p>This field contains a constant value and can be used to
- quickly identify a file as being an HDF5 file. The
- constant value is designed to allow easy identification of
- an HDF5 file and to allow certain types of data corruption
- to be detected. The file signature of an HDF5 file always
- contains the following values:</p>
- <center>
- <table border align="center" cellpadding="4">
- <tr align="center">
- <td align="right">Decimal:</td>
- <td width="8%">137</td>
- <td width="8%">72</td>
- <td width="8%">68</td>
- <td width="8%">70</td>
- <td width="8%">13</td>
- <td width="8%">10</td>
- <td width="8%">26</td>
- <td width="8%">10</td>
- </tr>
-
- <tr align="center">
- <td align="right">Hexadecimal:</td>
- <td>89</td>
- <td>48</td>
- <td>44</td>
- <td>46</td>
- <td>0d</td>
- <td>0a</td>
- <td>1a</td>
- <td>0a</td>
- </tr>
-
- <tr align="center">
- <td align="right">ASCII C Notation:</td>
- <td>\211</td>
- <td>H</td>
- <td>D</td>
- <td>F</td>
- <td>\r</td>
- <td>\n</td>
- <td>\032</td>
- <td>\n</td>
- </tr>
- </table>
- </center>
- <p>This signature both identifies the file as an HDF5 file
- and provides for immediate detection of common
- file-transfer problems. The first two bytes distinguish
- HDF5 files on systems that expect the first two bytes to
- identify the file type uniquely. The first byte is
- chosen as a non-ASCII value to reduce the probability
- that a text file may be misrecognized as an HDF5 file;
- also, it catches bad file transfers that clear bit
- 7. Bytes two through four name the format. The CR-LF
- sequence catches bad file transfers that alter newline
- sequences. The control-Z character stops file display
- under MS-DOS. The final line feed checks for the inverse
- of the CR-LF translation problem. (This is a direct
- descendent of the
- <a href="http://www.libpng.org/pub/png/spec/iso/index-object.html#5PNG-file-signature">PNG</a> file
- signature.)</p>
- <p><em>This field is present in version 0+ of the superblock.</em>
- </p></td>
- </tr>
-
- <tr>
- <td><p>Version Number of the Superblock</p></td>
- <td><p>This value is used to determine the format of the
- information in the superblock. When the format of the
- information in the superblock is changed, the version number
- is incremented to the next integer and can be used to
- determine how the information in the superblock is
- formatted.</p>
-
- <p>Values of 0, 1 and 2 are defined for this field. (The format
- of version 2 is described below, not here)
- </p>
-
- <p><em>This field is present in version 0+ of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Version Number of the File&rsquo;s Free Space
- Information</p></td>
- <td>
- <p>This value is used to determine the format of the
- file&rsquo;s free space information.
- </p>
- <p>The only value currently valid in this field is &lsquo;0&rsquo;, which
- indicates that the file&rsquo;s free space is as described
- <a href="#FreeSpaceManager">below</a>.
- </p>
-
- <p><em>This field is present in version 0 and 1 of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Version Number of the Root Group Symbol Table
- Entry</p></td>
- <td><p>This value is used to determine the format of the
- information in the Root Group Symbol Table Entry. When the
- format of the information in that field is changed, the
- version number is incremented to the next integer and can be
- used to determine how the information in the field
- is formatted.</p>
- <p>The only value currently valid in this field is &lsquo;0&rsquo;,
- which indicates that the root group symbol table entry is
- formatted as described <a href="#SymbolTableEntry">below</a>.</p>
- <p><em>This field is present in version 0 and 1 of the
- superblock.</em></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Version Number of the Shared Header Message Format</p></td>
- <td><p>This value is used to determine the format of the
- information in a shared object header message. Since the format
- of the shared header messages differs from the other private
- header messages, a version number is used to identify changes
- in the format.
- </p>
- <p>The only value currently valid in this field is &lsquo;0&rsquo;, which
- indicates that shared header messages are formatted as
- described <a href="#ObjectHeaderMessages">below</a>.
- </p>
-
- <p><em>This field is present in version 0 and 1 of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Offsets</p></td>
- <td><p>This value contains the number of bytes used to store
- addresses in the file. The values for the addresses of
- objects in the file are offsets relative to a base address,
- usually the address of the superblock signature. This
- allows a wrapper to be added after the file is created
- without invalidating the internal offset locations.
- </p>
-
- <p><em>This field is present in version 0+ of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Lengths</p></td>
- <td><p>This value contains the number of bytes used to store
- the size of an object.
- </p>
- <p><em>This field is present in version 0+ of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Group Leaf Node K</p></td>
- <td>
- <p>Each leaf node of a group B-tree will have at
- least this many entries but not more than twice this
- many. If a group has a single leaf node then it
- may have fewer entries.
- </p>
- <p>This value must be greater than zero.
- </p>
- <p>See the <a href="#Btrees">description</a> of B-trees below.
- </p>
-
- <p><em>This field is present in version 0 and 1 of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Group Internal Node K</p></td>
- <td>
- <p>Each internal node of a group B-tree will have at
- least this many entries but not more than twice this
- many. If the group has only one internal
- node then it might have fewer entries.
- </p>
- <p>This value must be greater than zero.
- </p>
- <p>See the <a href="#Btrees">description</a> of B-trees below.
- </p>
-
- <p><em>This field is present in version 0 and 1 of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>File Consistency Flags</p></td>
- <td>
- <p>This value contains flags to indicate information
- about the consistency of the information contained
- within the file. Currently, the following bit flags are
- defined:
- <ul>
- <li>Bit 0 set indicates that the file is opened for
- write-access.</li>
- <li>Bit 1 set indicates that the file has
- been verified for consistency and is guaranteed to be
- consistent with the format defined in this document.</li>
- <li>Bits 2-31 are reserved for future use.</li>
- </ul>
- Bit 0 should be
- set as the first action when a file is opened for write
- access and should be cleared only as the final action
- when closing a file. Bit 1 should be cleared during
- normal access to a file and only set after the file&rsquo;s
- consistency is guaranteed by the library or a
- consistency utility.
- </p>
-
- <p><em>This field is present in version 0+ of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Indexed Storage Internal Node K</p></td>
- <td>
- <p>Each internal node of an indexed storage B-tree will have at
- least this many entries but not more than twice this
- many. If the index storage B-tree has only one internal
- node then it might have fewer entries.
- </p>
- <p>This value must be greater than zero.
- </p>
- <p>See the <a href="#Btrees">description</a> of B-trees below.
- </p>
-
- <p><em>This field is present in version 1 of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Base Address</p></td>
- <td>
- <p>This is the absolute file address of the first byte of
- the HDF5 data within the file. The library currently
- constrains this value to be the absolute file address
- of the superblock itself when creating new files;
- future versions of the library may provide greater
- flexibility. When opening an existing file and this address does
- not match the offset of the superblock, the library assumes
- that the entire contents of the HDF5 file have been adjusted in
- the file and adjusts the base address and end of file address to
- reflect their new positions in the file. Unless otherwise noted,
- all other file addresses are relative to this base
- address.
- </p>
-
- <p><em>This field is present in version 0+ of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Address of Global Free-space Index</p></td>
- <td>
- <p>The file&rsquo;s free space is not persistent for version 0 and 1 of
- the superblock.
- Currently this field always contains the
- <a href="#UndefinedAddress">undefined address</a>.
- </p>
-
- <p><em>This field is present in version 0 and 1 of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>End of File Address</p></td>
- <td>
- <p>This is the absolute file address of the first byte past
- the end of all HDF5 data. It is used to determine whether a
- file has been accidentally truncated and as an address where
- file data allocation can occur if space from the free list is
- not used.
- </p>
-
- <p><em>This field is present in version 0+ of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Driver Information Block Address</p></td>
- <td>
- <p>This is the relative file address of the file driver
- information block which contains driver-specific
- information needed to reopen the file. If there is no
- driver information block then this entry should be the
- <a href="#UndefinedAddress">undefined address</a>.
- </p>
-
- <p><em>This field is present in version 0 and 1 of the superblock.</em>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Root Group Symbol Table Entry</p></td>
- <td>
- <p>This is the <a href="#SymbolTableEntry">symbol table entry</a>
- of the root group, which serves as the entry point into
- the group graph for the file.
- </p>
-
- <p><em>This field is present in version 0 and 1 of the superblock.</em>
- </p>
- </td>
+ <tr>
+ <td>Version # of Superblock</td>
+ <td>Version # of File&rsquo;s Free Space Storage</td>
+ <td>Version # of Root Group Symbol Table Entry</td>
+ <td>Reserved (zero)</td>
</tr>
- </table>
- </div>
- <br />
- <p>Version 2 of the superblock is described below:</p>
-
- <div align="center">
- <table class="format">
- <caption>
- Superblock (Version 2)
- </caption>
-
- <tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />Format Signature (8 bytes)<br /><br /></td>
- </tr>
-
- <tr>
- <td>Version # of Superblock</td>
- <td>Size of Offsets</td>
- <td>Size of Lengths</td>
- <td>File Consistency Flags</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Base Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Superblock Extension Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />End of File Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Root Group Object Header Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Superblock Checksum</td>
- </tr>
- </table>
+ <tr>
+ <td>Version # of Shared Header Message Format</td>
+ <td>Size of Offsets</td>
+ <td>Size of Lengths</td>
+ <td>Reserved (zero)</td>
+ </tr>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are
- of the size specified in &ldquo;Size of Offsets.&rdquo;)
- </td></tr>
- </table>
+ <td colspan="2">Group Leaf Node K</td>
+ <td colspan="2">Group Internal Node K</td>
+ </tr>
- </div>
+ <tr>
+ <td colspan="4">File Consistency Flags</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Format Signature</p></td>
- <td>
- <p>This field is the same as described for versions 0 and 1 of the
- superblock.
- </p></td>
- </tr>
-
- <tr>
- <td><p>Version Number of the Superblock</p></td>
- <td>
- <p>This field has a value of 2 and has the same meaning as for
- versions 0 and 1.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Offsets</p></td>
- <td>
- <p>This field is the same as described for versions 0 and 1 of the
- superblock.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Lengths</p></td>
- <td>
- <p>This field is the same as described for versions 0 and 1 of the
- superblock.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>File Consistency Flags</p></td>
- <td>
- <p>This field is the same as described for versions 0 and 1 except
- that it is smaller (the number of reserved bits has been reduced
- from 30 to 6).
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Base Address</p></td>
- <td>
- <p>This field is the same as described for versions 0 and 1 of the
- superblock.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Superblock Extension Address</p></td>
- <td>
- <p>The field is the address of the object header for the
- <a href="#SuperblockExt">superblock extension</a>.
- If there is no extension then this entry should be the
- <a href="#UndefinedAddress">undefined address</a>.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>End of File Address</p></td>
- <td>
- <p>This field is the same as described for versions 0 and 1 of the
- superblock.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Root Group Object Header Address</p></td>
- <td>
- <p>This is the address of
- the <a href="#DataObject">root group object header</a>,
- which serves as the entry point into the group graph for the file.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Superblock Checksum</p></td>
- <td>
- <p>The checksum for the superblock.
- </p>
- </td>
+ <tr>
+ <td colspan="2" style="border: dotted;">Indexed Storage Internal
+ Node K<sup>1</sup>
+ </td>
+ <td colspan="2" style="border: dotted;">Reserved (zero)<sup>1</sup></td>
</tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Base Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address of File Free space Info<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />End of File Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Driver Information Block Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Root Group Symbol Table Entry</td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets.&rdquo;)</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>(Items marked with a &lsquo;1&rsquo; in the above table are
+ new in version 1 of the superblock)</td>
+ </tr>
+ </table>
+</div>
<br />
-<h3><a name="DriverInfo">
-II.B. Disk Format: Level 0B - File Driver Info</a></h3>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Format Signature</p></td>
+ <td><p>This field contains a constant value and can be used
+ to quickly identify a file as being an HDF5 file. The constant
+ value is designed to allow easy identification of an HDF5 file and
+ to allow certain types of data corruption to be detected. The file
+ signature of an HDF5 file always contains the following values:</p>
+ <center>
+ <table border align="center" cellpadding="4">
+ <tr align="center">
+ <td align="right">Decimal:</td>
+ <td width="8%">137</td>
+ <td width="8%">72</td>
+ <td width="8%">68</td>
+ <td width="8%">70</td>
+ <td width="8%">13</td>
+ <td width="8%">10</td>
+ <td width="8%">26</td>
+ <td width="8%">10</td>
+ </tr>
+
+ <tr align="center">
+ <td align="right">Hexadecimal:</td>
+ <td>89</td>
+ <td>48</td>
+ <td>44</td>
+ <td>46</td>
+ <td>0d</td>
+ <td>0a</td>
+ <td>1a</td>
+ <td>0a</td>
+ </tr>
- <p>The <b>driver information block</b> is an optional region of the
- file which contains information needed by the file driver
- to reopen a file. The format is described below:</p>
+ <tr align="center">
+ <td align="right">ASCII C Notation:</td>
+ <td>\211</td>
+ <td>H</td>
+ <td>D</td>
+ <td>F</td>
+ <td>\r</td>
+ <td>\n</td>
+ <td>\032</td>
+ <td>\n</td>
+ </tr>
+ </table>
+ </center>
+ <p>
+ This signature both identifies the file as an HDF5 file and
+ provides for immediate detection of common file-transfer problems.
+ The first two bytes distinguish HDF5 files on systems that expect
+ the first two bytes to identify the file type uniquely. The first
+ byte is chosen as a non-ASCII value to reduce the probability that
+ a text file may be misrecognized as an HDF5 file; also, it catches
+ bad file transfers that clear bit 7. Bytes two through four name
+ the format. The CR-LF sequence catches bad file transfers that
+ alter newline sequences. The control-Z character stops file display
+ under MS-DOS. The final line feed checks for the inverse of the
+ CR-LF translation problem. (This is a direct descendent of the <a
+ href="http://www.libpng.org/pub/png/spec/iso/index-object.html#5PNG-file-signature">PNG</a>
+ file signature.)
+ </p>
+ <p>
+ <em>This field is present in version 0+ of the superblock.</em>
+ </p></td>
+ </tr>
+ <tr>
+ <td><p>Version Number of the Superblock</p></td>
+ <td><p>This value is used to determine the format of the
+ information in the superblock. When the format of the information
+ in the superblock is changed, the version number is incremented to
+ the next integer and can be used to determine how the information
+ in the superblock is formatted.</p>
- <div align="center">
- <table class="format">
- <caption>
- Driver Information Block
- </caption>
+ <p>Values of 0, 1 and 2 are defined for this field. (The format
+ of version 2 is described below, not here)</p>
+
+ <p>
+ <em>This field is present in version 0+ of the superblock.</em>
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Version Number of the File&rsquo;s Free Space
+ Information</p></td>
+ <td>
+ <p>This value is used to determine the format of the
+ file&rsquo;s free space information.</p>
+ <p>
+ The only value currently valid in this field is &lsquo;0&rsquo;,
+ which indicates that the file&rsquo;s free space is as described <a
+ href="#FreeSpaceManager">below</a>.
+ </p>
+
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Version Number of the Root Group Symbol Table Entry</p></td>
+ <td><p>This value is used to determine the format of the
+ information in the Root Group Symbol Table Entry. When the format
+ of the information in that field is changed, the version number is
+ incremented to the next integer and can be used to determine how
+ the information in the field is formatted.</p>
+ <p>
+ The only value currently valid in this field is &lsquo;0&rsquo;,
+ which indicates that the root group symbol table entry is formatted
+ as described <a href="#SymbolTableEntry">below</a>.
+ </p>
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Version Number of the Shared Header Message Format</p></td>
+ <td><p>This value is used to determine the format of the
+ information in a shared object header message. Since the format of
+ the shared header messages differs from the other private header
+ messages, a version number is used to identify changes in the
+ format.</p>
+ <p>
+ The only value currently valid in this field is &lsquo;0&rsquo;,
+ which indicates that shared header messages are formatted as
+ described <a href="#ObjectHeaderMessages">below</a>.
+ </p>
+
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p></td>
+ </tr>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
+ <td><p>Size of Offsets</p></td>
+ <td><p>This value contains the number of bytes used to store
+ addresses in the file. The values for the addresses of objects in
+ the file are offsets relative to a base address, usually the
+ address of the superblock signature. This allows a wrapper to be
+ added after the file is created without invalidating the internal
+ offset locations.</p>
+
+ <p>
+ <em>This field is present in version 0+ of the superblock.</em>
+ </p></td>
+ </tr>
<tr>
- <td>Version</td>
- <td colspan="3">Reserved</td>
+ <td><p>Size of Lengths</p></td>
+ <td><p>This value contains the number of bytes used to store
+ the size of an object.</p>
+ <p>
+ <em>This field is present in version 0+ of the superblock.</em>
+ </p></td>
</tr>
<tr>
- <td colspan="4">Driver Information Size</td>
+ <td><p>Group Leaf Node K</p></td>
+ <td>
+ <p>Each leaf node of a group B-tree will have at least this many
+ entries but not more than twice this many. If a group has a single
+ leaf node then it may have fewer entries.</p>
+ <p>This value must be greater than zero.</p>
+ <p>
+ See the <a href="#Btrees">description</a> of B-trees below.
+ </p>
+
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p>
+ </td>
</tr>
<tr>
- <td colspan="4"><br />Driver Identification (8 bytes)<br /><br /></td>
+ <td><p>Group Internal Node K</p></td>
+ <td>
+ <p>Each internal node of a group B-tree will have at least this
+ many entries but not more than twice this many. If the group has
+ only one internal node then it might have fewer entries.</p>
+ <p>This value must be greater than zero.</p>
+ <p>
+ See the <a href="#Btrees">description</a> of B-trees below.
+ </p>
+
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p>
+ </td>
</tr>
<tr>
- <td colspan="4"><br /><br />Driver Information (<em>variable size</em>)<br /><br /><br /></td>
+ <td><p>File Consistency Flags</p></td>
+ <td>
+ <p>This value contains flags to indicate information about the
+ consistency of the information contained within the file.
+ Currently, the following bit flags are defined:</p>
+ <ul>
+ <li>Bit 0 set indicates that the file is opened for
+ write-access.</li>
+ <li>Bit 1 set indicates that the file has been verified for
+ consistency and is guaranteed to be consistent with the format
+ defined in this document.</li>
+ <li>Bits 2-31 are reserved for future use.</li>
+ </ul> Bit 0 should be set as the first action when a file is opened for
+ write access and should be cleared only as the final action when
+ closing a file. Bit 1 should be cleared during normal access to a
+ file and only set after the file&rsquo;s consistency is guaranteed
+ by the library or a consistency utility.
+ <p></p>
+
+ <p>
+ <em>This field is present in version 0+ of the superblock.</em>
+ </p>
+ </td>
</tr>
- </table>
- </div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <tr>
+ <td><p>Indexed Storage Internal Node K</p></td>
+ <td>
+ <p>Each internal node of an indexed storage B-tree will have at
+ least this many entries but not more than twice this many. If the
+ index storage B-tree has only one internal node then it might have
+ fewer entries.</p>
+ <p>This value must be greater than zero.</p>
+ <p>
+ See the <a href="#Btrees">description</a> of B-trees below.
+ </p>
+
+ <p>
+ <em>This field is present in version 1 of the superblock.</em>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Base Address</p></td>
+ <td>
+ <p>This is the absolute file address of the first byte of the
+ HDF5 data within the file. The library currently constrains this
+ value to be the absolute file address of the superblock itself when
+ creating new files; future versions of the library may provide
+ greater flexibility. When opening an existing file and this address
+ does not match the offset of the superblock, the library assumes
+ that the entire contents of the HDF5 file have been adjusted in the
+ file and adjusts the base address and end of file address to
+ reflect their new positions in the file. Unless otherwise noted,
+ all other file addresses are relative to this base address.</p>
+
+ <p>
+ <em>This field is present in version 0+ of the superblock.</em>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Address of Global Free-space Index</p></td>
+ <td>
+ <p>
+ The file&rsquo;s free space is not persistent for version 0 and 1
+ of the superblock. Currently this field always contains the <a
+ href="#UndefinedAddress">undefined address</a>.
+ </p>
+
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>End of File Address</p></td>
+ <td>
+ <p>This is the absolute file address of the first byte past the
+ end of all HDF5 data. It is used to determine whether a file has
+ been accidentally truncated and as an address where file data
+ allocation can occur if space from the free list is not used.</p>
+
+ <p>
+ <em>This field is present in version 0+ of the superblock.</em>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Driver Information Block Address</p></td>
+ <td>
+ <p>
+ This is the relative file address of the file driver information
+ block which contains driver-specific information needed to reopen
+ the file. If there is no driver information block then this entry
+ should be the <a href="#UndefinedAddress">undefined address</a>.
+ </p>
+
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Root Group Symbol Table Entry</p></td>
+ <td>
+ <p>
+ This is the <a href="#SymbolTableEntry">symbol table entry</a> of
+ the root group, which serves as the entry point into the group
+ graph for the file.
+ </p>
+
+ <p>
+ <em>This field is present in version 0 and 1 of the
+ superblock.</em>
+ </p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<p>Version 2 of the superblock is described below:</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Superblock (Version 2)</caption>
+
+ <tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number of the Driver Information Block.
- This document describes version 0.
- </p>
- </td>
+ <td colspan="4"><br />Format Signature (8 bytes)<br />
+ <br /></td>
</tr>
<tr>
- <td><p>Driver Information Size</p></td>
- <td>
- <p>The size in bytes of the <em>Driver Information</em> field.
- </p>
- </td>
+ <td>Version # of Superblock</td>
+ <td>Size of Offsets</td>
+ <td>Size of Lengths</td>
+ <td>File Consistency Flags</td>
</tr>
<tr>
- <td><p>Driver Identification</p></td>
- <td>
- <p>This is an eight-byte ASCII string without null
- termination which identifies the driver and/or version number
- of the Driver Information Block. The predefined driver encoded
- in this field by the HDF5 Library is identified by the
- letters <code>NCSA</code> followed by the first four characters of
- the driver name. If the Driver Information block is not
- the original version then the last letter(s) of the
- identification will be replaced by a version number in
- ASCII, starting with 0.
- </p>
- <p>
- Identification for user-defined drivers is also eight-byte long.
- It can be arbitrary but should be unique to avoid
- the four character prefix &ldquo;NCSA&rdquo;.
- </p>
- </td>
+ <td colspan="4"><br />Base Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Superblock Extension Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />End of File Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Root Group Object Header Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Superblock Checksum</td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets.&rdquo;)</td>
+ </tr>
+ </table>
+
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Format Signature</p></td>
+ <td>
+ <p>This field is the same as described for versions 0 and 1 of
+ the superblock.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Version Number of the Superblock</p></td>
+ <td>
+ <p>This field has a value of 2 and has the same meaning as for
+ versions 0 and 1.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size of Offsets</p></td>
+ <td>
+ <p>This field is the same as described for versions 0 and 1 of
+ the superblock.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size of Lengths</p></td>
+ <td>
+ <p>This field is the same as described for versions 0 and 1 of
+ the superblock.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>File Consistency Flags</p></td>
+ <td>
+ <p>This field is the same as described for versions 0 and 1
+ except that it is smaller (the number of reserved bits has been
+ reduced from 30 to 6).</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Base Address</p></td>
+ <td>
+ <p>This field is the same as described for versions 0 and 1 of
+ the superblock.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Superblock Extension Address</p></td>
+ <td>
+ <p>
+ The field is the address of the object header for the <a
+ href="#SuperblockExt">superblock extension</a>. If there is no
+ extension then this entry should be the <a href="#UndefinedAddress">undefined
+ address</a>.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>End of File Address</p></td>
+ <td>
+ <p>This field is the same as described for versions 0 and 1 of
+ the superblock.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Root Group Object Header Address</p></td>
+ <td>
+ <p>
+ This is the address of the <a href="#DataObject">root group
+ object header</a>, which serves as the entry point into the group
+ graph for the file.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Superblock Checksum</p></td>
+ <td>
+ <p>The checksum for the superblock.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<h3>
+ <a name="DriverInfo"> II.B. Disk Format: Level 0B - File Driver
+ Info</a>
+</h3>
+
+<p>
+ The <b>driver information block</b> is an optional region of the file
+ which contains information needed by the file driver to reopen a file.
+ The format is described below:
+</p>
+
+
+<div align="center">
+ <table class="format">
+ <caption>Driver Information Block</caption>
+
+ <tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td colspan="3">Reserved</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Driver Information Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Driver Identification (8 bytes)<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />
+ <br />Driver Information (<em>variable size</em>)<br />
+ <br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number of the Driver Information Block. This
+ document describes version 0.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Driver Information Size</p></td>
+ <td>
+ <p>
+ The size in bytes of the <em>Driver Information</em> field.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Driver Identification</p></td>
+ <td>
+ <p>
+ This is an eight-byte ASCII string without null termination which
+ identifies the driver and/or version number of the Driver
+ Information Block. The predefined driver encoded in this field by
+ the HDF5 Library is identified by the letters
+ <code>NCSA</code>
+ followed by the first four characters of the driver name. If the
+ Driver Information block is not the original version then the last
+ letter(s) of the identification will be replaced by a version
+ number in ASCII, starting with 0.
+ </p>
+ <p>Identification for user-defined drivers is also eight-byte
+ long. It can be arbitrary but should be unique to avoid the four
+ character prefix &ldquo;NCSA&rdquo;.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Driver Information</p></td>
- <td>Driver information is stored in a format defined by the
- file driver (see description below).</td>
+ <td><p>Driver Information</p></td>
+ <td>Driver information is stored in a format defined by the file
+ driver (see description below).</td>
</tr>
- </table>
- </div>
+ </table>
+</div>
+
+<br /> The two drivers encoded in the
+<em>Driver Identification</em> field are as follows:
+<ul>
+ <li>Multi driver:
+ <p>The identifier for this driver is &ldquo;NCSAmulti&rdquo;. This
+ driver provides a mechanism for segregating raw data and different
+ types of metadata into multiple files. These files are viewed by the
+ library as a single virtual HDF5 file with a single file address. A
+ maximum of 6 files will be created for the following data:
+ superblock, B-tree, raw data, global heap, local heap, and object
+ header. More than one type of data can be written to the same file.</p>
+ </li>
+ <li>Family driver
+ <p>The identifier for this driver is &ldquo;NCSAfami&rdquo; and is
+ encoded in this field for library version 1.8 and after. This driver
+ is designed for systems that do not support files larger than 2
+ gigabytes by splitting the HDF5 file address space across several
+ smaller files. It does nothing to segregate metadata and raw data;
+ they are mixed in the address space just as they would be in a single
+ contiguous file.</p>
+ </li>
+</ul>
+<p>
+ The format of the <em>Driver Information</em> field for the above two
+ drivers are described below:
+</p>
- <br />
- The two drivers encoded in the <em>Driver Identification</em> field are as follows:
- <ul>
- <li>
- Multi driver:
- <p>
- The identifier for this driver is &ldquo;NCSAmulti&rdquo;.
- This driver provides a mechanism for segregating raw data and different types of metadata
- into multiple files.
- These files are viewed by the library as a single virtual HDF5 file with a single file address.
- A maximum of 6 files will be created for the following data:
- superblock, B-tree, raw data, global heap, local heap, and object header.
- More than one type of data can be written to the same file.
- </p></li>
- <li>
- Family driver
- <p>
- The identifier for this driver is &ldquo;NCSAfami&rdquo; and is encoded in this field for library version 1.8 and after.
- This driver is designed for systems that do not support files larger than 2 gigabytes
- by splitting the HDF5 file address space across several smaller files.
- It does nothing to segregate metadata and raw data;
- they are mixed in the address space just as they would be in a single contiguous file.
- </p></li>
- </ul>
- <p>The format of the <em>Driver Information</em> field for the
- above two drivers are described below:</p>
-
- <div align="center">
- <table class="format">
- <caption>
- Multi Driver Information
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Member Mapping</td>
- <td>Member Mapping</td>
- <td>Member Mapping</td>
- <td>Member Mapping</td>
- </tr>
-
- <tr>
- <td>Member Mapping</td>
- <td>Member Mapping</td>
- <td>Reserved</td>
- <td>Reserved</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address of Member File 1<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />End of Address for Member File 1<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address of Member File 2<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />End of Address for Member File 2<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />... ...<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address of Member File N<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />End of Address for Member File N<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name of Member File 1 <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name of Member File 2 <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />... ...<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name of Member File N <em>(variable size)</em><br /><br /></td>
- </tr>
+<div align="center">
+ <table class="format">
+ <caption>Multi Driver Information</caption>
- </table>
- </div>
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
+ <tr>
+ <td>Member Mapping</td>
+ <td>Member Mapping</td>
+ <td>Member Mapping</td>
+ <td>Member Mapping</td>
+ </tr>
+
+ <tr>
+ <td>Member Mapping</td>
+ <td>Member Mapping</td>
+ <td>Reserved</td>
+ <td>Reserved</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address of Member File 1<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />End of Address for Member File 1<br />
+ <br /></td>
+ </tr>
- <tr>
- <td><p>Member Mapping</p></td>
- <td><p>These fields are integer values from 1 to 6
- indicating how the data can be mapped to or merged with another type of
- data.
- <table class="list">
+ <tr>
+ <td colspan="4"><br />Address of Member File 2<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />End of Address for Member File 2<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />... ...<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address of Member File N<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />End of Address for Member File N<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name of Member File 1 <em>(variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name of Member File 2 <em>(variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />... ...<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name of Member File N <em>(variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Member Mapping</p></td>
+ <td><p>These fields are integer values from 1 to 6
+ indicating how the data can be mapped to or merged with another
+ type of data.</p>
+ <table class="list">
<tr>
- <th width="20%" align="center">Member Mapping</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Member Mapping</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
<td align="center">1</td>
@@ -1261,4097 +1399,4089 @@ II.B. Disk Format: Level 0B - File Driver Info</a></h3>
<td align="center">6</td>
<td>The object header data.</td>
</tr>
- </table></p>
- <p>For example, if the third field has the value 3 and all the rest have the
- value 1, it means there are two files: one for raw data, and one for superblock,
- B-tree, global heap, local heap, and object header.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Reserved</p></td>
- <td><p>These fields are reserved and should always be zero.</p></td>
- </tr>
-
- <tr>
- <td><p>Address of Member File N</p></td>
- <td><p>This field Specifies the virtual address at which the member file starts.</p>
- <p>N is the number of member files.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>End of Address for Member File N</p></td>
- <td><p>This field is the end of the allocated address for the member file.
- </p></td>
- </tr>
-
- <tr>
- <td><p>Name of Member File N</p></td>
- <td><p>This field is the null-terminated name of the member file and
- its length should be multiples of 8 bytes.
- Additional bytes will be padded with <em>NULL</em>s. The default naming
- convention is <em>%s-X.h5</em>, where <em>X</em> is one of the letters
- <em>s</em> (for superblock), <em>b</em> (for B-tree), <em>r</em> (for raw data),
- <em>g</em> (for global heap), <em>l</em> (for local heap), and <em>o</em> (for
- object header). The name of the whole HDF5 file will substitute the <em>%s</em>
- in the string.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ </table>
+ <p></p>
+ <p>For example, if the third field has the value 3 and all the
+ rest have the value 1, it means there are two files: one for raw
+ data, and one for superblock, B-tree, global heap, local heap, and
+ object header.</p></td>
+ </tr>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Family Driver Information
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="8"><br />Size of Member File<br /><br /></td>
- </tr>
+ <tr>
+ <td><p>Reserved</p></td>
+ <td><p>These fields are reserved and should always be zero.</p></td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Address of Member File N</p></td>
+ <td><p>This field Specifies the virtual address at which the
+ member file starts.</p>
+ <p>N is the number of member files.</p></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Size of Member File</p></td>
- <td><p>This field is the size of the member file in the family of files.</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>End of Address for Member File N</p></td>
+ <td><p>This field is the end of the allocated address for
+ the member file.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name of Member File N</p></td>
+ <td><p>
+ This field is the null-terminated name of the member file and its
+ length should be multiples of 8 bytes. Additional bytes will be
+ padded with <em>NULL</em>s. The default naming convention is <em>%s-X.h5</em>,
+ where <em>X</em> is one of the letters <em>s</em> (for superblock),
+ <em>b</em> (for B-tree), <em>r</em> (for raw data), <em>g</em> (for
+ global heap), <em>l</em> (for local heap), and <em>o</em> (for
+ object header). The name of the whole HDF5 file will substitute the
+ <em>%s</em> in the string.
+ </p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Family Driver Information</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="8"><br />Size of Member File<br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
<br />
-<h3><a name="SuperblockExt">
-II.C. Disk Format: Level 0C - Superblock Extension</a></h3>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Size of Member File</p></td>
+ <td><p>This field is the size of the member file in the
+ family of files.</p></td>
+ </tr>
+ </table>
+</div>
- <p>The <em>superblock extension</em> is used to store superblock metadata
- which is either optional, or added after the version of the superblock
- was defined. Superblock extensions may only exist when version 2+ of
- superblock is used. A superblock extension is an object header which may
- hold the following messages:</p>
- <ul>
- <li>
- <a href="#SOHMTableMessage">Shared Message Table message</a> containing
- information to locate the master table of shared object header message
- indices.</li>
- <li>
- <a href="#BtreeKValuesMessage">B-tree &lsquo;K&rsquo; Values message</a> containing
- non-default B-tree &lsquo;K&rsquo; values.</li>
- <li>
- <a href="#DrvInfoMessage">Driver Info message</a> containing information
- needed by the file driver in order to reopen a file.
- See also the
- <a href="#DriverInfo">&ldquo;Disk Format: Level 0B - File Driver
- Info&rdquo;</a> section above.</li>
- <li>
- <a href="#FsinfoMessage">File Space Info message</a> containing
- information about file space handling in the file.</li>
- </ul>
+<br />
+<h3>
+ <a name="SuperblockExt"> II.C. Disk Format: Level 0C - Superblock
+ Extension</a>
+</h3>
+
+<p>
+ The <em>superblock extension</em> is used to store superblock metadata
+ which is either optional, or added after the version of the superblock
+ was defined. Superblock extensions may only exist when version 2+ of
+ superblock is used. A superblock extension is an object header which
+ may hold the following messages:
+</p>
+<ul>
+ <li><a href="#SOHMTableMessage">Shared Message Table message</a>
+ containing information to locate the master table of shared object
+ header message indices.</li>
+ <li><a href="#BtreeKValuesMessage">B-tree &lsquo;K&rsquo;
+ Values message</a> containing non-default B-tree &lsquo;K&rsquo; values.</li>
+ <li><a href="#DrvInfoMessage">Driver Info message</a> containing
+ information needed by the file driver in order to reopen a file. See
+ also the <a href="#DriverInfo">&ldquo;Disk Format: Level 0B - File
+ Driver Info&rdquo;</a> section above.</li>
+ <li><a href="#FsinfoMessage">File Space Info message</a>
+ containing information about file space handling in the file.</li>
+</ul>
<br />
<br />
<hr />
-<h2><a name="FileInfra">
-III. Disk Format: Level 1 - File Infrastructure</a></h2>
-
-<br />
-<h3><a name="Btrees">
-III.A. Disk Format: Level 1A - B-trees and B-tree Nodes</a></h3>
-
- <p>B-trees allow flexible storage for objects which tend to grow
- in ways that cause the object to be stored discontiguously. B-trees
- are described in various algorithms books including &ldquo;Introduction to
- Algorithms&rdquo; by Thomas H. Cormen, Charles E. Leiserson, and Ronald
- L. Rivest. B-trees are used in several places in the HDF5 file format,
- when an index is needed for another data structure.</p>
-
- <p>The version 1 B-tree structure described below is the original index
- structure, but are limited by some bugs in our implementation (mainly in
- how they handle deleting records). The version 1 B-trees are being phased
- out in favor of the version 2 B-trees described below, although both
- types of structures may be found in the same file, depending on
- application settings when creating the file.</p>
-
-<br />
-<h4><a name="V1Btrees">
-III.A.1. Disk Format: Level 1A1 - Version 1 B-trees (B-link Trees)</a></h4>
-
- <p>Version 1 B-trees in HDF5 files an implementation of the B-link tree,
- in which the sibling nodes at a particular level in the tree are stored
- in a doubly-linked list, is described in the &ldquo;Efficient Locking for
- Concurrent Operations on B-trees&rdquo; paper by Phillip Lehman and S. Bing Yao
- as published in the <cite>ACM Transactions on Database Systems</cite>,
- Vol. 6, No. 4, December 1981.</p>
-
- <p>The B-link trees implemented by the file format contain one more
- key than the number of children. In other words, each child
- pointer out of a B-tree node has a left key and a right key.
- The pointers out of internal nodes point to sub-trees while
- the pointers out of leaf nodes point to symbol nodes and
- raw data chunks.
- Aside from that difference, internal nodes and leaf nodes
- are identical.</p>
-
- <div align="center">
- <table class="format">
- <caption>
- B-link Tree Nodes
- </caption>
+<h2>
+ <a name="FileInfra"> III. Disk Format: Level 1 - File
+ Infrastructure</a>
+</h2>
+
+<br />
+<h3>
+ <a name="Btrees"> III.A. Disk Format: Level 1A - B-trees and B-tree
+ Nodes</a>
+</h3>
+
+<p>B-trees allow flexible storage for objects which tend to grow in
+ ways that cause the object to be stored discontiguously. B-trees are
+ described in various algorithms books including &ldquo;Introduction to
+ Algorithms&rdquo; by Thomas H. Cormen, Charles E. Leiserson, and Ronald
+ L. Rivest. B-trees are used in several places in the HDF5 file format,
+ when an index is needed for another data structure.</p>
+
+<p>The version 1 B-tree structure described below is the original
+ index structure, but are limited by some bugs in our implementation
+ (mainly in how they handle deleting records). The version 1 B-trees are
+ being phased out in favor of the version 2 B-trees described below,
+ although both types of structures may be found in the same file,
+ depending on application settings when creating the file.</p>
+
+<br />
+<h4>
+ <a name="V1Btrees"> III.A.1. Disk Format: Level 1A1 - Version 1
+ B-trees (B-link Trees)</a>
+</h4>
+
+<p>
+ Version 1 B-trees in HDF5 files an implementation of the B-link tree,
+ in which the sibling nodes at a particular level in the tree are stored
+ in a doubly-linked list, is described in the &ldquo;Efficient Locking
+ for Concurrent Operations on B-trees&rdquo; paper by Phillip Lehman and
+ S. Bing Yao as published in the <cite>ACM Transactions on
+ Database Systems</cite>, Vol. 6, No. 4, December 1981.
+</p>
+
+<p>The B-link trees implemented by the file format contain one more
+ key than the number of children. In other words, each child pointer out
+ of a B-tree node has a left key and a right key. The pointers out of
+ internal nodes point to sub-trees while the pointers out of leaf nodes
+ point to symbol nodes and raw data chunks. Aside from that difference,
+ internal nodes and leaf nodes are identical.</p>
+
+<div align="center">
+ <table class="format">
+ <caption>B-link Tree Nodes</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Node Type</td>
- <td>Node Level</td>
- <td colspan="2">Entries Used</td>
+ <td>Node Type</td>
+ <td>Node Level</td>
+ <td colspan="2">Entries Used</td>
</tr>
<tr>
- <td colspan="4"><br />Address of Left Sibling<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Left Sibling<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Address of Right Sibling<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Right Sibling<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Key 0 (variable size)</td>
+ <td colspan="4">Key 0 (variable size)</td>
</tr>
<tr>
- <td colspan="4"><br />Address of Child 0<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Child 0<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Key 1 (variable size)</td>
+ <td colspan="4">Key 1 (variable size)</td>
</tr>
<tr>
- <td colspan="4"><br />Address of Child 1<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Child 1<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">...</td>
+ <td colspan="4">...</td>
</tr>
<tr>
- <td colspan="4">Key 2<em>K</em> (variable size)</td>
+ <td colspan="4">Key 2<em>K</em> (variable size)
+ </td>
</tr>
<tr>
- <td colspan="4"><br />Address of Child 2<em>K</em><sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Child 2<em>K</em><sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Key 2<em>K</em>+1 (variable size)</td>
+ <td colspan="4">Key 2<em>K</em>+1 (variable size)
+ </td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>TREE</code>&rdquo; is
- used to indicate the
- beginning of a B-link tree node. This gives file
- consistency checking utilities a better chance of
- reconstructing a damaged file.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Node Type</p></td>
- <td>
- <p>Each B-link tree points to a particular type of data.
- This field indicates the type of data as well as
- implying the maximum degree <em>K</em> of the tree and
- the size of each Key field.
-
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Node Type</th>
- <th width="80%" align="left">Description</th>
- </tr>
- <tr>
- <td align="center">0</td>
- <td>This tree points to group nodes.</td>
- </tr>
- <tr>
- <td align="center">1</td>
- <td>This tree points to raw data chunk nodes.</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Node Level</p></td>
- <td>
- <p>The node level indicates the level at which this node
- appears in the tree (leaf nodes are at level zero). Not
- only does the level indicate whether child pointers
- point to sub-trees or to data, but it can also be used
- to help file consistency checking utilities reconstruct
- damaged trees.
- </p>
- </td>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>TREE</code>
+ &rdquo; is used to indicate the beginning of a B-link tree node.
+ This gives file consistency checking utilities a better chance of
+ reconstructing a damaged file.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Node Type</p></td>
+ <td>
+ <p>
+ Each B-link tree points to a particular type of data. This field
+ indicates the type of data as well as implying the maximum degree <em>K</em>
+ of the tree and the size of each Key field.
+
+
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Node Type</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+ <tr>
+ <td align="center">0</td>
+ <td>This tree points to group nodes.</td>
+ </tr>
+ <tr>
+ <td align="center">1</td>
+ <td>This tree points to raw data chunk nodes.</td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Node Level</p></td>
+ <td>
+ <p>The node level indicates the level at which this node appears
+ in the tree (leaf nodes are at level zero). Not only does the level
+ indicate whether child pointers point to sub-trees or to data, but
+ it can also be used to help file consistency checking utilities
+ reconstruct damaged trees.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Entries Used</p></td>
- <td>
- <p>This determines the number of children to which this
- node points. All nodes of a particular type of tree
- have the same maximum degree, but most nodes will point
- to less than that number of children. The valid child
- pointers and keys appear at the beginning of the node
- and the unused pointers and keys appear at the end of
- the node. The unused pointers and keys have undefined
- values.
- </p>
- </td>
+ <td><p>Entries Used</p></td>
+ <td>
+ <p>This determines the number of children to which this node
+ points. All nodes of a particular type of tree have the same
+ maximum degree, but most nodes will point to less than that number
+ of children. The valid child pointers and keys appear at the
+ beginning of the node and the unused pointers and keys appear at
+ the end of the node. The unused pointers and keys have undefined
+ values.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Address of Left Sibling</p></td>
- <td>
- <p>This is the relative file address of the left sibling of
- the current node. If the current
- node is the left-most node at this level then this field
- is the <a href="#UndefinedAddress">undefined address</a>.
- </p>
- </td>
+ <td><p>Address of Left Sibling</p></td>
+ <td>
+ <p>
+ This is the relative file address of the left sibling of the
+ current node. If the current node is the left-most node at this
+ level then this field is the <a href="#UndefinedAddress">undefined
+ address</a>.
+ </p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Address of Right Sibling</p></td>
- <td>
- <p>This is the relative file address of the right sibling of
- the current node. If the current
- node is the right-most node at this level then this
- field is the <a href="#UndefinedAddress">undefined address</a>.
- </p>
- </td>
+ <td><p>Address of Right Sibling</p></td>
+ <td>
+ <p>
+ This is the relative file address of the right sibling of the
+ current node. If the current node is the right-most node at this
+ level then this field is the <a href="#UndefinedAddress">undefined
+ address</a>.
+ </p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Keys and Child Pointers</p></td>
- <td>
- <p>Each tree has 2<em>K</em>+1 keys with 2<em>K</em>
- child pointers interleaved between the keys. The number
- of keys and child pointers actually containing valid
- values is determined by the node&rsquo;s <em>Entries Used</em> field.
- If that field is <em>N</em> then the B-link tree contains
- <em>N</em> child pointers and <em>N</em>+1 keys.
- </p>
- </td>
+ <td><p>Keys and Child Pointers</p></td>
+ <td>
+ <p>
+ Each tree has 2<em>K</em>+1 keys with 2<em>K</em> child pointers
+ interleaved between the keys. The number of keys and child pointers
+ actually containing valid values is determined by the node&rsquo;s
+ <em>Entries Used</em> field. If that field is <em>N</em> then the
+ B-link tree contains <em>N</em> child pointers and <em>N</em>+1
+ keys.
+ </p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Key</p></td>
- <td>
- <p>The format and size of the key values is determined by
- the type of data to which this tree points. The keys are
- ordered and are boundaries for the contents of the child
- pointer; that is, the key values represented by child
- <em>N</em> fall between Key <em>N</em> and Key
- <em>N</em>+1. Whether the interval is open or closed on
- each end is determined by the type of data to which the
- tree points.
- </p>
-
- <p>
- The format of the key depends on the node type.
- For nodes of node type 0 (group nodes), the key is formatted as
- follows:
-
- <table class="list">
- <tr>
- <td width="20%">A single field of <i>Size of Lengths</i>
- bytes:</td>
- <td width="80%">Indicates the byte offset into the local heap
- for the first object name in the subtree which
- that key describes.
- </td>
- </tr>
- </table>
- </p>
-
-
- <p>
- For nodes of node type 1 (chunked raw data nodes), the key is
- formatted as follows:
-
- <table class="list">
- <tr>
- <td width="20%">Bytes 1-4:</td>
- <td width="80%">Size of chunk in bytes.</td>
- </tr>
- <tr>
- <td>Bytes 4-8:</td>
- <td>Filter mask, a 32-bit bit field indicating which
- filters have been skipped for this chunk. Each filter
- has an index number in the pipeline (starting at 0, with
- the first filter to apply) and if that filter is skipped,
- the bit corresponding to its index is set.</td>
- </tr>
- <tr>
- <td>(<em>D + 1</em>) 64-bit fields:</td>
- <td>The offset of the
- chunk within the dataset where <i>D</i> is the number
- of dimensions of the dataset, and the last value is the
- offset within the dataset&rsquo;s datatype and should always be
- zero. For example, if
- a chunk in a 3-dimensional dataset begins at the
- position <code>[5,5,5]</code>, there will be three
- such 64-bit values, each with the value of
- <code>5</code>, followed by a <code>0</code> value.</td>
- </tr>
- </table>
- </p>
-
- </td>
+ <td><p>Key</p></td>
+ <td>
+ <p>
+ The format and size of the key values is determined by the type of
+ data to which this tree points. The keys are ordered and are
+ boundaries for the contents of the child pointer; that is, the key
+ values represented by child <em>N</em> fall between Key <em>N</em>
+ and Key <em>N</em>+1. Whether the interval is open or closed on
+ each end is determined by the type of data to which the tree
+ points.
+ </p>
+
+ <p>The format of the key depends on the node type. For nodes of
+ node type 0 (group nodes), the key is formatted as follows:</p>
+ <table class="list">
+ <tr>
+ <td width="20%">A single field of <i>Size of Lengths</i>
+ bytes:
+ </td>
+ <td width="80%">Indicates the byte offset into the local heap
+ for the first object name in the subtree which that key
+ describes.</td>
+ </tr>
+ </table>
+ <p></p>
+
+
+ <p>For nodes of node type 1 (chunked raw data nodes), the key is
+ formatted as follows:</p>
+ <table class="list">
+ <tr>
+ <td width="20%">Bytes 1-4:</td>
+ <td width="80%">Size of chunk in bytes.</td>
+ </tr>
+ <tr>
+ <td>Bytes 4-8:</td>
+ <td>Filter mask, a 32-bit bit field indicating which filters
+ have been skipped for this chunk. Each filter has an index number
+ in the pipeline (starting at 0, with the first filter to apply)
+ and if that filter is skipped, the bit corresponding to its index
+ is set.</td>
+ </tr>
+ <tr>
+ <td>(<em>D + 1</em>) 64-bit fields:
+ </td>
+ <td>The offset of the chunk within the dataset where <i>D</i>
+ is the number of dimensions of the dataset, and the last value is
+ the offset within the dataset&rsquo;s datatype and should always
+ be zero. For example, if a chunk in a 3-dimensional dataset
+ begins at the position <code>[5,5,5]</code>, there will be three
+ such 64-bit values, each with the value of <code>5</code>,
+ followed by a <code>0</code> value.
+ </td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
</tr>
<tr valign="top">
- <td><p>Child Pointer</p></td>
- <td>
- <p>The tree node contains file addresses of subtrees or
- data depending on the node level. Nodes at Level 0 point
- to data addresses, either raw data chunks or group nodes.
- Nodes at non-zero levels point to other nodes of the
- same B-tree.
- </p>
- <p>For raw data chunk nodes, the child pointer is the address
- of a single raw data chunk. For group nodes, the child pointer
- points to a <a href="#SymbolTable">symbol table</a>, which contains
- information for multiple symbol table entries.
- </p>
- </td>
+ <td><p>Child Pointer</p></td>
+ <td>
+ <p>The tree node contains file addresses of subtrees or data
+ depending on the node level. Nodes at Level 0 point to data
+ addresses, either raw data chunks or group nodes. Nodes at non-zero
+ levels point to other nodes of the same B-tree.</p>
+ <p>
+ For raw data chunk nodes, the child pointer is the address of a
+ single raw data chunk. For group nodes, the child pointer points to
+ a <a href="#SymbolTable">symbol table</a>, which contains
+ information for multiple symbol table entries.
+ </p>
+ </td>
</tr>
- </table>
- </div>
-
- <p>
- Conceptually, each B-tree node looks like this:</p>
- <center>
- <table>
- <tr valign="top" align="center">
- <td>key[0]</td><td>&nbsp;</td>
- <td>child[0]</td><td>&nbsp;</td>
- <td>key[1]</td><td>&nbsp;</td>
- <td>child[1]</td><td>&nbsp;</td>
- <td>key[2]</td><td>&nbsp;</td>
- <td>...</td><td>&nbsp;</td>
- <td>...</td><td>&nbsp;</td>
- <td>key[<i>N</i>-1]</td><td>&nbsp;</td>
- <td>child[<i>N</i>-1]</td><td>&nbsp;</td>
- <td>key[<i>N</i>]</td>
- </tr>
- </table>
- </center>
- <br />
-
- where child[<i>i</i>] is a pointer to a sub-tree (at a level
- above Level 0) or to data (at Level 0).
- Each key[<i>i</i>] describes an <i>item</i> stored by the B-tree
- (a chunk or an object of a group node). The range of values
- represented by child[<i>i</i>] is indicated by key[<i>i</i>]
- and key[<i>i</i>+1].
-
-
- <p>The following question must next be answered:
- &ldquo;Is the value described by key[<i>i</i>] contained in
- child[<i>i</i>-1] or in child[<i>i</i>]?&rdquo;
- The answer depends on the type of tree.
- In trees for groups (node type 0) the object described by
- key[<i>i</i>] is the greatest object contained in
- child[<i>i</i>-1] while in chunk trees (node type 1) the
- chunk described by key[<i>i</i>] is the least chunk in
- child[<i>i</i>].</p>
-
- <p>That means that key[0] for group trees is sometimes unused;
- it points to offset zero in the heap, which is always the
- empty string and compares as &ldquo;less-than&rdquo; any valid object name.</p>
-
- <p>And key[<i>N</i>] for chunk trees is sometimes unused;
- it contains a chunk offset which compares as &ldquo;greater-than&rdquo;
- any other chunk offset and has a chunk byte size of zero
- to indicate that it is not actually allocated.</p>
-
-<br />
-<h4><a name="V2Btrees">
-III.A.2. Disk Format: Level 1A2 - Version 2 B-trees</a></h4>
-
- <p>Version 2 B-trees are &ldquo;traditional&rdquo; B-trees, with one major difference.
- Instead of just using a simple pointer (or address in the file) to a
- child of an internal node, the pointer to the child node contains two
- additional pieces of information: the number of records in the child
- node itself, and the total number of records in the child node and
- all its descendants. Storing this additional information allows fast
- array-like indexing to locate the n<sup>th</sup> record in the B-tree.</p>
-
- <p>The entry into a version 2 B-tree is a header which contains global
- information about the structure of the B-tree. The <em>root node
- address</em>
- field in the header points to the B-tree root node, which is either an
- internal or leaf node, depending on the value in the header&rsquo;s
- <em>depth</em> field. An internal node consists of records plus
- pointers to further leaf or internal nodes in the tree. A leaf node
- consists of solely of records. The format of the records depends on
- the B-tree type (stored in the header).</p>
-
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree Header
- </caption>
+ </table>
+</div>
+
+<p>Conceptually, each B-tree node looks like this:</p>
+<center>
+ <table>
+ <tr valign="top" align="center">
+ <td>key[0]</td>
+ <td>&nbsp;</td>
+ <td>child[0]</td>
+ <td>&nbsp;</td>
+ <td>key[1]</td>
+ <td>&nbsp;</td>
+ <td>child[1]</td>
+ <td>&nbsp;</td>
+ <td>key[2]</td>
+ <td>&nbsp;</td>
+ <td>...</td>
+ <td>&nbsp;</td>
+ <td>...</td>
+ <td>&nbsp;</td>
+ <td>key[<i>N</i>-1]
+ </td>
+ <td>&nbsp;</td>
+ <td>child[<i>N</i>-1]
+ </td>
+ <td>&nbsp;</td>
+ <td>key[<i>N</i>]
+ </td>
+ </tr>
+ </table>
+</center>
+<br /> where child[
+<i>i</i>] is a pointer to a sub-tree (at a level above Level 0) or to
+data (at Level 0). Each key[
+<i>i</i>] describes an
+<i>item</i> stored by the B-tree (a chunk or an object of a group node).
+The range of values represented by child[
+<i>i</i>] is indicated by key[
+<i>i</i>] and key[
+<i>i</i>+1].
+
+
+<p>
+ The following question must next be answered: &ldquo;Is the value
+ described by key[<i>i</i>] contained in child[<i>i</i>-1] or in child[<i>i</i>]?&rdquo;
+ The answer depends on the type of tree. In trees for groups (node type
+ 0) the object described by key[<i>i</i>] is the greatest object
+ contained in child[<i>i</i>-1] while in chunk trees (node type 1) the
+ chunk described by key[<i>i</i>] is the least chunk in child[<i>i</i>].
+</p>
+
+<p>That means that key[0] for group trees is sometimes unused; it
+ points to offset zero in the heap, which is always the empty string and
+ compares as &ldquo;less-than&rdquo; any valid object name.</p>
+
+<p>
+ And key[<i>N</i>] for chunk trees is sometimes unused; it contains a
+ chunk offset which compares as &ldquo;greater-than&rdquo; any other
+ chunk offset and has a chunk byte size of zero to indicate that it is
+ not actually allocated.
+</p>
+
+<br />
+<h4>
+ <a name="V2Btrees"> III.A.2. Disk Format: Level 1A2 - Version 2
+ B-trees</a>
+</h4>
+
+<p>
+ Version 2 B-trees are &ldquo;traditional&rdquo; B-trees, with one major
+ difference. Instead of just using a simple pointer (or address in the
+ file) to a child of an internal node, the pointer to the child node
+ contains two additional pieces of information: the number of records in
+ the child node itself, and the total number of records in the child
+ node and all its descendants. Storing this additional information
+ allows fast array-like indexing to locate the n<sup>th</sup> record in
+ the B-tree.
+</p>
+
+<p>
+ The entry into a version 2 B-tree is a header which contains global
+ information about the structure of the B-tree. The <em>root node
+ address</em> field in the header points to the B-tree root node, which is
+ either an internal or leaf node, depending on the value in the
+ header&rsquo;s <em>depth</em> field. An internal node consists of
+ records plus pointers to further leaf or internal nodes in the tree. A
+ leaf node consists of solely of records. The format of the records
+ depends on the B-tree type (stored in the header).
+</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree Header</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
-
- <tr>
- <td colspan="4">Signature</td>
- </tr>
- <tr>
- <td>Version</td>
- <td>Type</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
- <tr>
- <td colspan="4">Node Size</td>
- </tr>
- <tr>
- <td colspan="2">Record Size</td>
- <td colspan="2">Depth</td>
- </tr>
- <tr>
- <td>Split Percent</td>
- <td>Merge Percent</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Root Node Address<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="2">Number of Records in Root Node</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Total Number of Records in B-tree<sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
- <table class="note">
+ </tr>
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td colspan="4">Signature</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>Version</td>
+ <td>Type</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+ <tr>
+ <td colspan="4">Node Size</td>
+ </tr>
+ <tr>
+ <td colspan="2">Record Size</td>
+ <td colspan="2">Depth</td>
+ </tr>
+ <tr>
+ <td>Split Percent</td>
+ <td>Merge Percent</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Root Node Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="2">Number of Records in Root Node</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Total Number of Records in B-tree<sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
- </div>
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>BTHD</code>&rdquo; is
- used to indicate the header of a version 2 B-link tree node.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number for this B-tree header. This document
- describes version 0.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Type</p></td>
- <td>
- <p>This field indicates the type of B-tree:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
- <tr>
- <td align="center">0</td>
- <td>A &ldquo;testing&rdquo; B-tree, this value should <em>not</em> be
- used for storing records in actual HDF5 files.
- </td>
- </tr>
- <tr>
- <td align="center">1</td>
- <td>This B-tree is used for indexing indirectly accessed,
- non-filtered &lsquo;huge&rsquo; fractal heap objects.
- </td>
- </tr>
- <tr>
- <td align="center">2</td>
- <td>This B-tree is used for indexing indirectly accessed,
- filtered &lsquo;huge&rsquo; fractal heap objects.
- </td>
- </tr>
- <tr>
- <td align="center">3</td>
- <td>This B-tree is used for indexing directly accessed,
- non-filtered &lsquo;huge&rsquo; fractal heap objects.
- </td>
- </tr>
- <tr>
- <td align="center">4</td>
- <td>This B-tree is used for indexing directly accessed,
- filtered &lsquo;huge&rsquo; fractal heap objects.
- </td>
- </tr>
- <tr>
- <td align="center">5</td>
- <td>This B-tree is used for indexing the &lsquo;name&rsquo; field for
- links in indexed groups.
- </td>
- </tr>
- <tr>
- <td align="center">6</td>
- <td>This B-tree is used for indexing the &lsquo;creation order&rsquo;
- field for links in indexed groups.
- </td>
- </tr>
- <tr>
- <td align="center">7</td>
- <td>This B-tree is used for indexing shared object header
- messages.
- </td>
- </tr>
- <tr>
- <td align="center">8</td>
- <td>This B-tree is used for indexing the &lsquo;name&rsquo; field for
- indexed attributes.
- </td>
- </tr>
- <tr>
- <td align="center">9</td>
- <td>This B-tree is used for indexing the &lsquo;creation order&rsquo;
- field for indexed attributes.
- </td>
- </tr>
- </table></p>
- <p>The format of records for each type is described below.</p>
- </td>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>BTHD</code>
+ &rdquo; is used to indicate the header of a version 2 B-link tree
+ node.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number for this B-tree header. This document
+ describes version 0.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Type</p></td>
+ <td>
+ <p>This field indicates the type of B-tree:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+ <tr>
+ <td align="center">0</td>
+ <td>A &ldquo;testing&rdquo; B-tree, this value should <em>not</em>
+ be used for storing records in actual HDF5 files.
+ </td>
+ </tr>
+ <tr>
+ <td align="center">1</td>
+ <td>This B-tree is used for indexing indirectly accessed,
+ non-filtered &lsquo;huge&rsquo; fractal heap objects.</td>
+ </tr>
+ <tr>
+ <td align="center">2</td>
+ <td>This B-tree is used for indexing indirectly accessed,
+ filtered &lsquo;huge&rsquo; fractal heap objects.</td>
+ </tr>
+ <tr>
+ <td align="center">3</td>
+ <td>This B-tree is used for indexing directly accessed,
+ non-filtered &lsquo;huge&rsquo; fractal heap objects.</td>
+ </tr>
+ <tr>
+ <td align="center">4</td>
+ <td>This B-tree is used for indexing directly accessed,
+ filtered &lsquo;huge&rsquo; fractal heap objects.</td>
+ </tr>
+ <tr>
+ <td align="center">5</td>
+ <td>This B-tree is used for indexing the &lsquo;name&rsquo;
+ field for links in indexed groups.</td>
+ </tr>
+ <tr>
+ <td align="center">6</td>
+ <td>This B-tree is used for indexing the &lsquo;creation
+ order&rsquo; field for links in indexed groups.</td>
+ </tr>
+ <tr>
+ <td align="center">7</td>
+ <td>This B-tree is used for indexing shared object header
+ messages.</td>
+ </tr>
+ <tr>
+ <td align="center">8</td>
+ <td>This B-tree is used for indexing the &lsquo;name&rsquo;
+ field for indexed attributes.</td>
+ </tr>
+ <tr>
+ <td align="center">9</td>
+ <td>This B-tree is used for indexing the &lsquo;creation
+ order&rsquo; field for indexed attributes.</td>
+ </tr>
+ </table>
+ <p></p>
+ <p>The format of records for each type is described below.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Node Size</p></td>
- <td>
- <p>This is the size in bytes of all B-tree nodes.
- </p>
- </td>
+ <td><p>Node Size</p></td>
+ <td>
+ <p>This is the size in bytes of all B-tree nodes.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Record Size</p></td>
- <td>
- <p>This field is the size in bytes of the B-tree record.
- </p>
- </td>
+ <td><p>Record Size</p></td>
+ <td>
+ <p>This field is the size in bytes of the B-tree record.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Depth</p></td>
- <td>
- <p>This is the depth of the B-tree.
- </p>
- </td>
+ <td><p>Depth</p></td>
+ <td>
+ <p>This is the depth of the B-tree.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Split Percent</p></td>
- <td>
- <p>The percent full that a node needs to increase above before it
- is split.
- </p>
- </td>
+ <td><p>Split Percent</p></td>
+ <td>
+ <p>The percent full that a node needs to increase above before
+ it is split.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Merge Percent</p></td>
- <td>
- <p>The percent full that a node needs to be decrease below before it
- is split.
- </p>
- </td>
+ <td><p>Merge Percent</p></td>
+ <td>
+ <p>The percent full that a node needs to be decrease below
+ before it is split.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Root Node Address</p></td>
- <td>
- <p>This is the address of the root B-tree node. A B-tree with
- no records will have the <a href="#UndefinedAddress">undefined
- address</a> in this field.
- </p>
- </td>
+ <td><p>Root Node Address</p></td>
+ <td>
+ <p>
+ This is the address of the root B-tree node. A B-tree with no
+ records will have the <a href="#UndefinedAddress">undefined
+ address</a> in this field.
+ </p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Number of Records in Root Node</p></td>
- <td>
- <p>This is the number of records in the root node.
- </p>
- </td>
+ <td><p>Number of Records in Root Node</p></td>
+ <td>
+ <p>This is the number of records in the root node.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Total Number of Records in B-tree</p></td>
- <td>
- <p>This is the total number of records in the entire B-tree.
- </p>
- </td>
+ <td><p>Total Number of Records in B-tree</p></td>
+ <td>
+ <p>This is the total number of records in the entire B-tree.</p>
+ </td>
</tr>
<tr valign="top">
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the B-tree header.
- </p>
- </td>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the B-tree header.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree Internal Node
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree Internal Node</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version</td>
- <td>Type</td>
- <td colspan="2">Records 0, 1, 2...N-1 <em>(variable size)</em></td>
+ <td>Version</td>
+ <td>Type</td>
+ <td colspan="2">Records 0, 1, 2...N-1 <em>(variable size)</em></td>
</tr>
- <tr>
- <td colspan="4"><br />Child Node Pointer 0<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Number of Records N<sub>0</sub> for Child Node 0 <em>(variable size)</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Total Number of Records for Child Node 0 <em>(optional, variable size)</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Child Node Pointer 1<sup>O</sup><br /><br /></td>
- </tr>
- <td colspan="4"><br />Number of Records N<sub>1</sub> for Child Node 1 <em>(variable size)</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Total Number of Records for Child Node 1 <em>(optional, variable size)</em></td>
- </tr>
- <tr>
- <td colspan="4">...</td>
- </tr>
- <tr>
- <td colspan="4"><br />Child Node Pointer N<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Number of Records N<sub>n</sub> for Child Node N <em>(variable size)</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Total Number of Records for Child Node N <em>(optional, variable size)</em></td>
- </tr>
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
+ <tr>
+ <td colspan="4"><br />Child Node Pointer 0<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Number of Records N<sub>0</sub> for Child
+ Node 0 <em>(variable size)</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Total Number of Records for Child Node 0
+ <em>(optional, variable size)</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Child Node Pointer 1<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <td colspan="4"><br />Number of Records N<sub>1</sub> for Child
+ Node 1 <em>(variable size)</em></td>
+ <tr></tr>
+ <tr>
+ <td colspan="4"><br />Total Number of Records for Child Node 1
+ <em>(optional, variable size)</em></td>
+ </tr>
+ <tr>
+ <td colspan="4">...</td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Child Node Pointer N<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Number of Records N<sub>n</sub> for Child
+ Node N <em>(variable size)</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Total Number of Records for Child Node N
+ <em>(optional, variable size)</em></td>
+ </tr>
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
- </div>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>BTIN</code>&rdquo; is
- used to indicate the internal node of a B-link tree.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>BTIN</code>
+ &rdquo; is used to indicate the internal node of a B-link tree.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number for this B-tree internal node.
- This document describes version 0.
- </p>
- </td>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number for this B-tree internal node. This
+ document describes version 0.</p>
+ </td>
</tr>
<tr>
- <td><p>Type</p></td>
- <td>
- <p>This field is the type of the B-tree node. It should always
- be the same as the B-tree type in the header.
- </p>
- </td>
+ <td><p>Type</p></td>
+ <td>
+ <p>This field is the type of the B-tree node. It should always
+ be the same as the B-tree type in the header.</p>
+ </td>
</tr>
<tr>
- <td><p>Records</p></td>
- <td>
- <p>The size of this field is determined by the number of records
- for this node and the record size (from the header). The format
- of records depends on the type of B-tree.
- </p>
- </td>
+ <td><p>Records</p></td>
+ <td>
+ <p>The size of this field is determined by the number of records
+ for this node and the record size (from the header). The format of
+ records depends on the type of B-tree.</p>
+ </td>
</tr>
<tr>
- <td><p>Child Node Pointer</p></td>
- <td>
- <p>This field is the address of the child node pointed to by the
- internal node.
- </p>
- </td>
+ <td><p>Child Node Pointer</p></td>
+ <td>
+ <p>This field is the address of the child node pointed to by the
+ internal node.</p>
+ </td>
</tr>
<tr>
- <td><p>Number of Records in Child Node</p></td>
- <td>
- <p>This is the number of records in the child node pointed to by
- the corresponding <em>Node Pointer</em>.
- </p>
- <p>The number of bytes used to store this field is determined by
- the maximum possible number of records able to be stored in the
- child node.
- </p>
- <p>
- The maximum number of records in a child node is computed
- in the following way:
-
+ <td><p>Number of Records in Child Node</p></td>
+ <td>
+ <p>
+ This is the number of records in the child node pointed to by the
+ corresponding <em>Node Pointer</em>.
+ </p>
+ <p>The number of bytes used to store this field is determined by
+ the maximum possible number of records able to be stored in the
+ child node.</p>
+ <p>The maximum number of records in a child node is computed in
+ the following way:</p>
<ul>
- <li>Subtract the fixed size overhead for
- the child node (for example, its signature, version,
- checksum, and so on and <em>one</em> pointer triplet
- of information for the child node (because there is one
- more pointer triplet than records in each internal node))
- from the size of nodes for the B-tree. </li>
- <li>Divide that result by the size of a record plus the
- pointer triplet of information stored to reach each
- child node from this node.
+ <li>Subtract the fixed size overhead for the child node (for
+ example, its signature, version, checksum, and so on and <em>one</em>
+ pointer triplet of information for the child node (because there
+ is one more pointer triplet than records in each internal node))
+ from the size of nodes for the B-tree.
+ </li>
+ <li>Divide that result by the size of a record plus the
+ pointer triplet of information stored to reach each child node
+ from this node.</li>
</ul>
- </p>
- <p>
- Note that leaf nodes do not encode any
- child pointer triplets, so the maximum number of records in a
- leaf node is just the node size minus the leaf node overhead,
- divided by the record size.
- </p>
- <p>
- Also note that the first level of internal nodes above the
- leaf nodes do not encode the <em>Total Number of Records in Child
- Node</em> value in the child pointer triplets (since it is the
- same as the <em>Number of Records in Child Node</em>), so the
- maximum number of records in these nodes is computed with the
- equation above, but using (<em>Child Pointer</em>, <em>Number of
- Records in Child Node</em>) pairs instead of triplets.
- </p>
- <p>
- The number of
- bytes used to encode this field is the least number of bytes
- required to encode the maximum number of records in a child
- node value for the child nodes below this level
- in the B-tree.
- </p>
- <p>
- For example, if the maximum number of child records is
- 123, one byte will be used to encode these values in this
- node; if the maximum number of child records is
- 20000, two bytes will be used to encode these values in this
- node; and so on. The maximum number of bytes used to
- encode these values is 8 (in other words, an unsigned
- 64-bit integer).
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Total Number of Records in Child Node</p></td>
- <td>
- <p>This is the total number of records for the node pointed to by
- the corresponding <em>Node Pointer</em> and all its children.
- This field exists only in nodes whose depth in the B-tree node
- is greater than 1 (in other words, the &ldquo;twig&rdquo;
- internal nodes, just above leaf nodes, do not store this
- field in their child node pointers).
- </p>
- <p>The number of bytes used to store this field is determined by
- the maximum possible number of records able to be stored in the
- child node and its descendants.
- </p>
- <p>
- The maximum possible number of records able to be stored in a
- child node and its descendants is computed iteratively, in the
- following way: The maximum number of records in a leaf node
- is computed, then that value is used to compute the maximum
- possible number of records in the first level of internal nodes
- above the leaf nodes. Multiplying these two values together
- determines the maximum possible number of records in child node
- pointers for the level of nodes two levels above leaf nodes.
- This process is continued up to any level in the B-tree.
- </p>
- <p>
- The number of bytes used to encode this value is computed in
- the same way as for the <em>Number of Records in Child Node</em>
- field.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for this node.
- </p>
- </td>
+ <p></p>
+ <p>Note that leaf nodes do not encode any child pointer
+ triplets, so the maximum number of records in a leaf node is just
+ the node size minus the leaf node overhead, divided by the record
+ size.</p>
+ <p>
+ Also note that the first level of internal nodes above the leaf
+ nodes do not encode the <em>Total Number of Records in Child
+ Node</em> value in the child pointer triplets (since it is the same as
+ the <em>Number of Records in Child Node</em>), so the maximum
+ number of records in these nodes is computed with the equation
+ above, but using (<em>Child Pointer</em>, <em>Number of
+ Records in Child Node</em>) pairs instead of triplets.
+ </p>
+ <p>The number of bytes used to encode this field is the least
+ number of bytes required to encode the maximum number of records in
+ a child node value for the child nodes below this level in the
+ B-tree.</p>
+ <p>For example, if the maximum number of child records is 123,
+ one byte will be used to encode these values in this node; if the
+ maximum number of child records is 20000, two bytes will be used to
+ encode these values in this node; and so on. The maximum number of
+ bytes used to encode these values is 8 (in other words, an unsigned
+ 64-bit integer).</p>
+ </td>
</tr>
- </table>
- </div>
+ <tr>
+ <td><p>Total Number of Records in Child Node</p></td>
+ <td>
+ <p>
+ This is the total number of records for the node pointed to by the
+ corresponding <em>Node Pointer</em> and all its children. This
+ field exists only in nodes whose depth in the B-tree node is
+ greater than 1 (in other words, the &ldquo;twig&rdquo; internal
+ nodes, just above leaf nodes, do not store this field in their
+ child node pointers).
+ </p>
+ <p>The number of bytes used to store this field is determined by
+ the maximum possible number of records able to be stored in the
+ child node and its descendants.</p>
+ <p>The maximum possible number of records able to be stored in a
+ child node and its descendants is computed iteratively, in the
+ following way: The maximum number of records in a leaf node is
+ computed, then that value is used to compute the maximum possible
+ number of records in the first level of internal nodes above the
+ leaf nodes. Multiplying these two values together determines the
+ maximum possible number of records in child node pointers for the
+ level of nodes two levels above leaf nodes. This process is
+ continued up to any level in the B-tree.</p>
+ <p>
+ The number of bytes used to encode this value is computed in the
+ same way as for the <em>Number of Records in Child Node</em> field.
+ </p>
+ </td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree Leaf Node
- </caption>
+ <tr>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for this node.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree Leaf Node</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version</td>
- <td>Type</td>
- <td colspan="2">Record 0, 1, 2...N-1 <em>(variable size)</em></td>
- </tr>
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
- </div>
+ <td>Version</td>
+ <td>Type</td>
+ <td colspan="2">Record 0, 1, 2...N-1 <em>(variable size)</em></td>
+ </tr>
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>BTLF</code>&ldquo; is
- used to indicate the leaf node of a version 2 B-link tree.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>BTLF</code>
+ &ldquo; is used to indicate the leaf node of a version 2 B-link
+ tree.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number for this B-tree leaf node.
- This document describes version 0.
- </p>
- </td>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number for this B-tree leaf node. This document
+ describes version 0.</p>
+ </td>
</tr>
<tr>
- <td><p>Type</p></td>
- <td>
- <p>This field is the type of the B-tree node. It should always
- be the same as the B-tree type in the header.
- </p>
- </td>
- </tr>
+ <td><p>Type</p></td>
+ <td>
+ <p>This field is the type of the B-tree node. It should always
+ be the same as the B-tree type in the header.</p>
+ </td>
+ </tr>
<tr>
- <td><p>Records</p></td>
- <td>
- <p>The size of this field is determined by the number of records
- for this node and the record size (from the header). The format
- of records depends on the type of B-tree.
- </p>
- </td>
+ <td><p>Records</p></td>
+ <td>
+ <p>The size of this field is determined by the number of records
+ for this node and the record size (from the header). The format of
+ records depends on the type of B-tree.</p>
+ </td>
</tr>
<tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for this node.
- </p>
- </td>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for this node.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>The record layout for each stored (in other words, non-testing)
+<br />
+<p>The record layout for each stored (in other words, non-testing)
B-tree type is as follows:</p>
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 1 Record Layout - Indirectly Accessed, Non-Filtered,
- &lsquo;Huge&rsquo; Fractal Heap Objects
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 1 Record Layout - Indirectly
+ Accessed, Non-Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
<tr>
- <td colspan="4"><br />Huge Object Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Huge Object Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Huge Object Length<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Huge Object Length<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Huge Object ID<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Huge Object ID<sup>L</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Huge Object Address</p></td>
- <td>
- <p>The address of the huge object in the file.
- </p>
- </td>
+ <td><p>Huge Object Address</p></td>
+ <td>
+ <p>The address of the huge object in the file.</p>
+ </td>
</tr>
<tr>
- <td><p>Huge Object Length</p></td>
- <td>
- <p>The length of the huge object in the file.
- </p>
- </td>
+ <td><p>Huge Object Length</p></td>
+ <td>
+ <p>The length of the huge object in the file.</p>
+ </td>
</tr>
<tr>
- <td><p>Huge Object ID</p></td>
- <td>
- <p>The heap ID for the huge object.
- </p>
- </td>
+ <td><p>Huge Object ID</p></td>
+ <td>
+ <p>The heap ID for the huge object.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 2 Record Layout - Indirectly Accessed, Filtered,
- &lsquo;Huge&rsquo; Fractal Heap Objects
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 2 Record Layout - Indirectly
+ Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Filter Mask</td>
+ <td colspan="4">Filter Mask</td>
</tr>
<tr>
- <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Huge Object ID<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Huge Object ID<sup>L</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Filtered Huge Object Address</p></td>
- <td>
- <p>The address of the filtered huge object in the file.
- </p>
- </td>
+ <td><p>Filtered Huge Object Address</p></td>
+ <td>
+ <p>The address of the filtered huge object in the file.</p>
+ </td>
</tr>
<tr>
- <td><p>Filtered Huge Object Length</p></td>
- <td>
- <p>The length of the filtered huge object in the file.
- </p>
- </td>
+ <td><p>Filtered Huge Object Length</p></td>
+ <td>
+ <p>The length of the filtered huge object in the file.</p>
+ </td>
</tr>
<tr>
- <td><p>Filter Mask</p></td>
- <td>
- <p>A 32-bit bit field indicating which filters have been skipped for
- this chunk. Each filter has an index number in the pipeline
- (starting at 0, with the first filter to apply) and if that
- filter is skipped, the bit corresponding to its index is set.
- </p>
- </td>
+ <td><p>Filter Mask</p></td>
+ <td>
+ <p>A 32-bit bit field indicating which filters have been skipped
+ for this chunk. Each filter has an index number in the pipeline
+ (starting at 0, with the first filter to apply) and if that filter
+ is skipped, the bit corresponding to its index is set.</p>
+ </td>
</tr>
<tr>
- <td><p>Filtered Huge Object Memory Size</p></td>
- <td>
- <p>The size of the de-filtered huge object in memory.
- </p>
- </td>
+ <td><p>Filtered Huge Object Memory Size</p></td>
+ <td>
+ <p>The size of the de-filtered huge object in memory.</p>
+ </td>
</tr>
<tr>
- <td><p>Huge Object ID</p></td>
- <td>
- <p>The heap ID for the huge object.
- </p>
- </td>
+ <td><p>Huge Object ID</p></td>
+ <td>
+ <p>The heap ID for the huge object.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 3 Record Layout - Directly Accessed, Non-Filtered,
- &lsquo;Huge&rsquo; Fractal Heap Objects
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 3 Record Layout - Directly
+ Accessed, Non-Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
<tr>
- <td colspan="4"><br />Huge Object Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Huge Object Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Huge Object Length<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Huge Object Length<sup>L</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Huge Object Address</p></td>
- <td>
- <p>The address of the huge object in the file.
- </p>
- </td>
+ <td><p>Huge Object Address</p></td>
+ <td>
+ <p>The address of the huge object in the file.</p>
+ </td>
</tr>
<tr>
- <td><p>Huge Object Length</p></td>
- <td>
- <p>The length of the huge object in the file.
- </p>
- </td>
+ <td><p>Huge Object Length</p></td>
+ <td>
+ <p>The length of the huge object in the file.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 4 Record Layout - Directly Accessed, Filtered,
- &lsquo;Huge&rsquo; Fractal Heap Objects
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 4 Record Layout - Directly
+ Accessed, Filtered, &lsquo;Huge&rsquo; Fractal Heap Objects</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Filter Mask</td>
+ <td colspan="4">Filter Mask</td>
</tr>
<tr>
- <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Filtered Huge Object Address</p></td>
- <td>
- <p>The address of the filtered huge object in the file.
- </p>
- </td>
+ <td><p>Filtered Huge Object Address</p></td>
+ <td>
+ <p>The address of the filtered huge object in the file.</p>
+ </td>
</tr>
<tr>
- <td><p>Filtered Huge Object Length</p></td>
- <td>
- <p>The length of the filtered huge object in the file.
- </p>
- </td>
+ <td><p>Filtered Huge Object Length</p></td>
+ <td>
+ <p>The length of the filtered huge object in the file.</p>
+ </td>
</tr>
<tr>
- <td><p>Filter Mask</p></td>
- <td>
- <p>A 32-bit bit field indicating which filters have been skipped for
- this chunk. Each filter has an index number in the pipeline
- (starting at 0, with the first filter to apply) and if that
- filter is skipped, the bit corresponding to its index is set.
- </p>
- </td>
+ <td><p>Filter Mask</p></td>
+ <td>
+ <p>A 32-bit bit field indicating which filters have been skipped
+ for this chunk. Each filter has an index number in the pipeline
+ (starting at 0, with the first filter to apply) and if that filter
+ is skipped, the bit corresponding to its index is set.</p>
+ </td>
</tr>
<tr>
- <td><p>Filtered Huge Object Memory Size</p></td>
- <td>
- <p>The size of the de-filtered huge object in memory.
- </p>
- </td>
+ <td><p>Filtered Huge Object Memory Size</p></td>
+ <td>
+ <p>The size of the de-filtered huge object in memory.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 5 Record Layout - Link Name for Indexed Group
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 5 Record Layout - Link Name
+ for Indexed Group</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
<tr>
- <td colspan="4">Hash of Name</td>
+ <td colspan="4">Hash of Name</td>
</tr>
<tr>
- <td colspan="4">ID <em>(bytes 1-4)</em></td>
- </tr>
+ <td colspan="4">ID <em>(bytes 1-4)</em></td>
+ </tr>
<tr>
- <td colspan="3">ID <em>(bytes 5-7)</em></td>
- </tr>
+ <td colspan="3">ID <em>(bytes 5-7)</em></td>
+ </tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Hash</p></td>
- <td>
- <p>This field is hash value of the name for the link. The hash
- value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
- the link&rsquo;s name.
- </p>
- </td>
+ <td><p>Hash</p></td>
+ <td>
+ <p>This field is hash value of the name for the link. The hash
+ value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
+ the link&rsquo;s name.</p>
+ </td>
</tr>
<tr>
- <td><p>ID</p></td>
- <td>
- <p>This is a 7-byte sequence of bytes and is the heap ID for the
- link record in the group&rsquo;s fractal heap.</p>
- </td>
+ <td><p>ID</p></td>
+ <td>
+ <p>This is a 7-byte sequence of bytes and is the heap ID for the
+ link record in the group&rsquo;s fractal heap.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 6 Record Layout - Creation Order for Indexed Group
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 6 Record Layout - Creation
+ Order for Indexed Group</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Creation Order <em>(8 bytes)</em><br /><br /></td>
+ <td colspan="4"><br />Creation Order <em>(8 bytes)</em><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">ID <em>(bytes 1-4)</em></td>
+ <td colspan="4">ID <em>(bytes 1-4)</em></td>
</tr>
<tr>
- <td colspan="3">ID <em>(bytes 5-7)</em></td>
+ <td colspan="3">ID <em>(bytes 5-7)</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Creation Order</p></td>
- <td>
- <p>This field is the creation order value for the link.
- </p>
- </td>
+ <td><p>Creation Order</p></td>
+ <td>
+ <p>This field is the creation order value for the link.</p>
+ </td>
</tr>
<tr>
- <td><p>ID</p></td>
- <td>
- <p>This is a 7-byte sequence of bytes and is the heap ID for the
- link record in the group&rsquo;s fractal heap.</p>
- </td>
+ <td><p>ID</p></td>
+ <td>
+ <p>This is a 7-byte sequence of bytes and is the heap ID for the
+ link record in the group&rsquo;s fractal heap.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 7 Record Layout - Shared Object Header Messages (Sub-Type 0 - Message in Heap)
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 7 Record Layout - Shared
+ Object Header Messages (Sub-Type 0 - Message in Heap)</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan>Message Location</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan>Message Location</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4">Hash</td>
+ <td colspan="4">Hash</td>
</tr>
<tr>
- <td colspan="4">Reference Count</td>
+ <td colspan="4">Reference Count</td>
</tr>
<tr>
- <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
+ <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br />
+ <br /></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Message Location</p></td>
- <td>
- <p>This field Indicates the location where the message is stored:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
- <tr>
- <td align="center">0</td>
- <td>Shared message is stored in shared message index heap.
- </td>
- </tr>
- <tr>
- <td align="center">1</td>
- <td>Shared message is stored in object header.
- </td>
- </tr>
- </table></p>
- </td>
+ <td><p>Message Location</p></td>
+ <td>
+ <p>This field Indicates the location where the message is
+ stored:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+ <tr>
+ <td align="center">0</td>
+ <td>Shared message is stored in shared message index heap.</td>
+ </tr>
+ <tr>
+ <td align="center">1</td>
+ <td>Shared message is stored in object header.</td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
</tr>
<tr>
- <td><p>Hash</p></td>
- <td>
- <p>This field is hash value of the shared message. The hash
- value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
- the shared message.</p>
- </td>
+ <td><p>Hash</p></td>
+ <td>
+ <p>This field is hash value of the shared message. The hash
+ value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
+ the shared message.</p>
+ </td>
</tr>
<tr>
- <td><p>Reference Count</p></td>
- <td>
- <p>The number of objects which reference this message.</p>
- </td>
+ <td><p>Reference Count</p></td>
+ <td>
+ <p>The number of objects which reference this message.</p>
+ </td>
</tr>
<tr>
- <td><p>Heap ID</p></td>
- <td>
- <p>This is an 8-byte sequence of bytes and is the heap ID for the
- shared message in the shared message index&rsquo;s fractal heap.</p>
- </td>
+ <td><p>Heap ID</p></td>
+ <td>
+ <p>This is an 8-byte sequence of bytes and is the heap ID for
+ the shared message in the shared message index&rsquo;s fractal
+ heap.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 7 Record Layout - Shared Object Header Messages (Sub-Type 1 - Message in Object Header)
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 7 Record Layout - Shared
+ Object Header Messages (Sub-Type 1 - Message in Object Header)</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan>Message Location</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan>Message Location</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4">Hash</td>
+ <td colspan="4">Hash</td>
</tr>
<tr>
- <td>Reserved (zero)</td>
- <td>Message Type</td>
- <td colspan="2">Object Header Index</td>
+ <td>Reserved (zero)</td>
+ <td>Message Type</td>
+ <td colspan="2">Object Header Index</td>
</tr>
<tr>
- <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Object Header Address<sup>O</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Message Location</p></td>
- <td>
- <p>This field Indicates the location where the message is stored:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
- <tr>
- <td align="center">0</td>
- <td>Shared message is stored in shared message index heap.
- </td>
- </tr>
- <tr>
- <td align="center">1</td>
- <td>Shared message is stored in object header.
- </td>
- </tr>
- </table></p>
- </td>
+ <td><p>Message Location</p></td>
+ <td>
+ <p>This field Indicates the location where the message is
+ stored:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+ <tr>
+ <td align="center">0</td>
+ <td>Shared message is stored in shared message index heap.</td>
+ </tr>
+ <tr>
+ <td align="center">1</td>
+ <td>Shared message is stored in object header.</td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
</tr>
<tr>
- <td><p>Hash</p></td>
- <td>
- <p>This field is hash value of the shared message. The hash
- value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
- the shared message.</p>
- </td>
+ <td><p>Hash</p></td>
+ <td>
+ <p>This field is hash value of the shared message. The hash
+ value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
+ the shared message.</p>
+ </td>
</tr>
<tr>
- <td><p>Message Type</p></td>
- <td>
- <p>The object header message type of the shared message.</p>
- </td>
+ <td><p>Message Type</p></td>
+ <td>
+ <p>The object header message type of the shared message.</p>
+ </td>
</tr>
<tr>
- <td><p>Object Header Index</p></td>
- <td>
- <p>This field indicates that the shared message is the n<sup>th</sup> message
- of its type in the specified object header.</p>
- </td>
+ <td><p>Object Header Index</p></td>
+ <td>
+ <p>
+ This field indicates that the shared message is the n<sup>th</sup>
+ message of its type in the specified object header.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Object Header Address</p></td>
- <td>
- <p>The address of the object header containing the shared message.</p>
- </td>
+ <td><p>Object Header Address</p></td>
+ <td>
+ <p>The address of the object header containing the shared
+ message.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 8 Record Layout - Attribute Name for Indexed Attributes
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 8 Record Layout - Attribute
+ Name for Indexed Attributes</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
+ <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br />
+ <br /></td>
</tr>
<tr>
- <td colspan>Message Flags</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan>Message Flags</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4">Creation Order</td>
+ <td colspan="4">Creation Order</td>
</tr>
<tr>
- <td colspan="4">Hash of Name</td>
+ <td colspan="4">Hash of Name</td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Heap ID</p></td>
- <td>
- <p>This is an 8-byte sequence of bytes and is the heap ID for the
- attribute in the object&rsquo;s attribute fractal heap.</p>
- </td>
+ <td><p>Heap ID</p></td>
+ <td>
+ <p>This is an 8-byte sequence of bytes and is the heap ID for
+ the attribute in the object&rsquo;s attribute fractal heap.</p>
+ </td>
</tr>
<tr>
- <td><p>Message Flags</p></td>
- <td><p>The object header message flags for the attribute message.</p>
- </td>
+ <td><p>Message Flags</p></td>
+ <td><p>The object header message flags for the attribute
+ message.</p></td>
</tr>
<tr>
- <td><p>Creation Order</p></td>
- <td>
- <p>This field is the creation order value for the attribute.
- </p>
- </td>
+ <td><p>Creation Order</p></td>
+ <td>
+ <p>This field is the creation order value for the attribute.</p>
+ </td>
</tr>
<tr>
- <td><p>Hash</p></td>
- <td>
- <p>This field is hash value of the name for the attribute. The hash
- value is the Jenkins&rsquo; lookup3 checksum algorithm applied to
- the attribute&rsquo;s name.
- </p>
- </td>
+ <td><p>Hash</p></td>
+ <td>
+ <p>This field is hash value of the name for the attribute. The
+ hash value is the Jenkins&rsquo; lookup3 checksum algorithm applied
+ to the attribute&rsquo;s name.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Version 2 B-tree, Type 9 Record Layout- Creation Order for Indexed Attributes
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Version 2 B-tree, Type 9 Record Layout- Creation
+ Order for Indexed Attributes</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
+ <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br />
+ <br /></td>
</tr>
<tr>
- <td colspan>Message Flags</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan>Message Flags</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4">Creation Order</td>
+ <td colspan="4">Creation Order</td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Heap ID</p></td>
- <td>
- <p>This is an 8-byte sequence of bytes and is the heap ID for the
- attribute in the object&rsquo;s attribute fractal heap.</p>
- </td>
+ <td><p>Heap ID</p></td>
+ <td>
+ <p>This is an 8-byte sequence of bytes and is the heap ID for
+ the attribute in the object&rsquo;s attribute fractal heap.</p>
+ </td>
</tr>
<tr>
- <td><p>Message Flags</p></td>
- <td>
- <p>The object header message flags for the attribute message.</p>
- </td>
+ <td><p>Message Flags</p></td>
+ <td>
+ <p>The object header message flags for the attribute message.</p>
+ </td>
</tr>
<tr>
- <td><p>Creation Order</p></td>
- <td>
- <p>This field is the creation order value for the attribute.
- </p>
- </td>
+ <td><p>Creation Order</p></td>
+ <td>
+ <p>This field is the creation order value for the attribute.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
<br />
-<h3><a name="SymbolTable">
-III.B. Disk Format: Level 1B - Group Symbol Table Nodes</a></h3>
-
- <p>A group is an object internal to the file that allows
- arbitrary nesting of objects within the file (including other groups).
- A group maps a set of link names in the group to a set of relative
- file addresses of objects in the file. Certain metadata for an object to
- which the group points can be cached in the group&rsquo;s symbol table entry in
- addition to being in the object&rsquo;s header.</p>
-
- <p>An HDF5 object name space can be stored hierarchically by
- partitioning the name into components and storing each
- component as a link in a group. The link for a
- non-ultimate component points to the group containing
- the next component. The link for the last
- component points to the object being named.</p>
+<h3>
+ <a name="SymbolTable"> III.B. Disk Format: Level 1B - Group Symbol
+ Table Nodes</a>
+</h3>
+
+<p>A group is an object internal to the file that allows arbitrary
+ nesting of objects within the file (including other groups). A group
+ maps a set of link names in the group to a set of relative file
+ addresses of objects in the file. Certain metadata for an object to
+ which the group points can be cached in the group&rsquo;s symbol table
+ entry in addition to being in the object&rsquo;s header.</p>
+
+<p>An HDF5 object name space can be stored hierarchically by
+ partitioning the name into components and storing each component as a
+ link in a group. The link for a non-ultimate component points to the
+ group containing the next component. The link for the last component
+ points to the object being named.</p>
+
+<p>
+ One implementation of a group is a collection of symbol table nodes
+ indexed by a B-link tree. Each symbol table node contains entries for
+ one or more links. If an attempt is made to add a link to an already
+ full symbol table node containing 2<em>K</em> entries, then the node is
+ split and one node contains <em>K</em> symbols and the other contains <em>K</em>+1
+ symbols.
+</p>
- <p>One implementation of a group is a collection of symbol table nodes
- indexed by a B-link tree. Each symbol table node contains entries
- for one or more links. If an attempt is made to add a link to an already
- full symbol table node containing 2<em>K</em> entries, then the node is
- split and one node contains <em>K</em> symbols and the other contains
- <em>K</em>+1 symbols.</p>
-
- <div align="center">
- <table class="format">
- <caption>
- Symbol Table Node (A Leaf of a B-link tree)
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Symbol Table Node (A Leaf of a B-link tree)</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version Number</td>
- <td>Reserved (zero)</td>
- <td colspan="2">Number of Symbols</td>
+ <td>Version Number</td>
+ <td>Reserved (zero)</td>
+ <td colspan="2">Number of Symbols</td>
</tr>
<tr>
- <td colspan="4"><br /><br />Group Entries<br /><br /><br /></td>
+ <td colspan="4"><br />
+ <br />Group Entries<br />
+ <br />
+ <br /></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>SNOD</code>&rdquo; is
- used to indicate the
- beginning of a symbol table node. This gives file
- consistency checking utilities a better chance of
- reconstructing a damaged file.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>SNOD</code>
+ &rdquo; is used to indicate the beginning of a symbol table node.
+ This gives file consistency checking utilities a better chance of
+ reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version Number</p></td>
- <td>
- <p>The version number for the symbol table node. This
- document describes version 1. (There is no version &lsquo;0&rsquo;
- of the symbol table node)
- </p>
- </td>
+ <td><p>Version Number</p></td>
+ <td>
+ <p>The version number for the symbol table node. This document
+ describes version 1. (There is no version &lsquo;0&rsquo; of the
+ symbol table node)</p>
+ </td>
</tr>
<tr>
- <td><p>Number of Entries</p></td>
- <td>
- <p>Although all symbol table nodes have the same length,
- most contain fewer than the maximum possible number of
- link entries. This field indicates how many entries
- contain valid data. The valid entries are packed at the
- beginning of the symbol table node while the remaining
- entries contain undefined values.
- </p>
- </td>
+ <td><p>Number of Entries</p></td>
+ <td>
+ <p>Although all symbol table nodes have the same length, most
+ contain fewer than the maximum possible number of link entries.
+ This field indicates how many entries contain valid data. The valid
+ entries are packed at the beginning of the symbol table node while
+ the remaining entries contain undefined values.</p>
+ </td>
</tr>
<tr>
- <td><p>Symbol Table Entries</p></td>
- <td>
- <p>Each link has an entry in the symbol table node.
- The format of the entry is described below.
- There are 2<em>K</em> entries in each group node, where
- <em>K</em> is the &ldquo;Group Leaf Node K&rdquo; value from the
- <a href="#Superblock">superblock</a>.
- </p>
- </td>
+ <td><p>Symbol Table Entries</p></td>
+ <td>
+ <p>
+ Each link has an entry in the symbol table node. The format of the
+ entry is described below. There are 2<em>K</em> entries in each
+ group node, where <em>K</em> is the &ldquo;Group Leaf Node K&rdquo;
+ value from the <a href="#Superblock">superblock</a>.
+ </p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
<br />
-<h3><a name="SymbolTableEntry">
-III.C. Disk Format: Level 1C - Symbol Table Entry </a></h3>
+<h3>
+ <a name="SymbolTableEntry"> III.C. Disk Format: Level 1C - Symbol
+ Table Entry </a>
+</h3>
- <p>Each symbol table entry in a symbol table node is designed
- to allow for very fast browsing of stored objects.
- Toward that design goal, the symbol table entries
- include space for caching certain constant metadata from the
- object header.</p>
+<p>Each symbol table entry in a symbol table node is designed to
+ allow for very fast browsing of stored objects. Toward that design
+ goal, the symbol table entries include space for caching certain
+ constant metadata from the object header.</p>
- <div align="center">
- <table class="format">
- <caption>
- Symbol Table Entry
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Symbol Table Entry</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Link Name Offset<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Link Name Offset<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Object Header Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Cache Type</td>
+ <td colspan="4">Cache Type</td>
</tr>
<tr>
- <td colspan="4">Reserved (zero)</td>
+ <td colspan="4">Reserved (zero)</td>
</tr>
<tr>
- <td colspan="4"><br /><br />Scratch-pad Space (16 bytes)<br /><br /><br /></td>
+ <td colspan="4"><br />
+ <br />Scratch-pad Space (16 bytes)<br />
+ <br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Link Name Offset</p></td>
- <td>
- <p>This is the byte offset into the group&rsquo;s local
- heap for the name of the link. The name is null
- terminated.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Object Header Address</p></td>
- <td>
- <p>Every object has an object header which serves as a
- permanent location for the object&rsquo;s metadata. In addition
- to appearing in the object header, some of the object&rsquo;s metadata
- can be cached in the scratch-pad space.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Cache Type</p></td>
- <td>
- <p>The cache type is determined from the object header.
- It also determines the format for the scratch-pad space:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Type</th>
- <th width="80%" align="left">Description</th>
- </tr>
- <tr>
- <td align="center">0</td>
- <td>No data is cached by the group entry. This
- is guaranteed to be the case when an object header
- has a link count greater than one.
- </td>
- </tr>
- <tr>
- <td align="center">1</td>
- <td>Group object header metadata is cached in the
- scratch-pad space. This implies that the symbol table
- entry refers to another group.
- </td>
- </tr>
- <tr>
- <td align="center">2</td>
- <td>The entry is a symbolic link. The first four bytes
- of the scratch-pad space are the offset into the local
- heap for the link value. The object header address
- will be undefined.
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Reserved</p></td>
- <td>
- <p>These four bytes are present so that the scratch-pad
- space is aligned on an eight-byte boundary. They are
- always set to zero.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Scratch-pad Space</p></td>
- <td>
- <p>This space is used for different purposes, depending
- on the value of the Cache Type field. Any metadata
- about an object represented in the scratch-pad
- space is duplicated in the object header for that
- object.
- </p>
- <p>
- Furthermore, no data is cached in the group
- entry scratch-pad space if the object header for
- the object has a link count greater than one.
- </p>
- </td>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Link Name Offset</p></td>
+ <td>
+ <p>This is the byte offset into the group&rsquo;s local heap for
+ the name of the link. The name is null terminated.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Object Header Address</p></td>
+ <td>
+ <p>Every object has an object header which serves as a permanent
+ location for the object&rsquo;s metadata. In addition to appearing
+ in the object header, some of the object&rsquo;s metadata can be
+ cached in the scratch-pad space.</p>
+ </td>
</tr>
- </table>
- </div>
+
+ <tr>
+ <td><p>Cache Type</p></td>
+ <td>
+ <p>The cache type is determined from the object header. It also
+ determines the format for the scratch-pad space:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Type</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+ <tr>
+ <td align="center">0</td>
+ <td>No data is cached by the group entry. This is guaranteed
+ to be the case when an object header has a link count greater
+ than one.</td>
+ </tr>
+ <tr>
+ <td align="center">1</td>
+ <td>Group object header metadata is cached in the scratch-pad
+ space. This implies that the symbol table entry refers to another
+ group.</td>
+ </tr>
+ <tr>
+ <td align="center">2</td>
+ <td>The entry is a symbolic link. The first four bytes of the
+ scratch-pad space are the offset into the local heap for the link
+ value. The object header address will be undefined.</td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Reserved</p></td>
+ <td>
+ <p>These four bytes are present so that the scratch-pad space is
+ aligned on an eight-byte boundary. They are always set to zero.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Scratch-pad Space</p></td>
+ <td>
+ <p>This space is used for different purposes, depending on the
+ value of the Cache Type field. Any metadata about an object
+ represented in the scratch-pad space is duplicated in the object
+ header for that object.</p>
+ <p>Furthermore, no data is cached in the group entry scratch-pad
+ space if the object header for the object has a link count greater
+ than one.</p>
+ </td>
+ </tr>
+ </table>
+</div>
<br />
<h4>Format of the Scratch-pad Space</h4>
- <p>The symbol table entry scratch-pad space is formatted
- according to the value in the Cache Type field.</p>
+<p>The symbol table entry scratch-pad space is formatted according
+ to the value in the Cache Type field.</p>
- <p>If the Cache Type field contains the value zero
- <code>(0)</code> then no information is
- stored in the scratch-pad space.</p>
+<p>
+ If the Cache Type field contains the value zero
+ <code>(0)</code>
+ then no information is stored in the scratch-pad space.
+</p>
- <p>If the Cache Type field contains the value one
- <code>(1)</code>, then the scratch-pad space
- contains cached metadata for another object header
- in the following format:</p>
+<p>
+ If the Cache Type field contains the value one
+ <code>(1)</code>
+ , then the scratch-pad space contains cached metadata for another
+ object header in the following format:
+</p>
- <div align="center">
- <table class="format">
- <caption>
- Object Header Scratch-pad Format
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Object Header Scratch-pad Format</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Address of B-tree<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of B-tree<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Address of Name Heap<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Name Heap<sup>O</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Address of B-tree</p></td>
- <td>
- <p>This is the file address for the root of the
- group&rsquo;s B-tree.
- </p>
- </td>
+ <td><p>Address of B-tree</p></td>
+ <td>
+ <p>This is the file address for the root of the group&rsquo;s
+ B-tree.</p>
+ </td>
</tr>
<tr>
- <td><p>Address of Name Heap</p></td>
- <td>
- <p>This is the file address for the group&rsquo;s local
- heap, in which are stored the group&rsquo;s symbol names.
- </p>
- </td>
+ <td><p>Address of Name Heap</p></td>
+ <td>
+ <p>This is the file address for the group&rsquo;s local heap, in
+ which are stored the group&rsquo;s symbol names.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>If the Cache Type field contains the value two
- <code>(2)</code>, then the scratch-pad space
- contains cached metadata for a symbolic link
- in the following format:</p>
+<br />
+<p>
+ If the Cache Type field contains the value two
+ <code>(2)</code>
+ , then the scratch-pad space contains cached metadata for a symbolic
+ link in the following format:
+</p>
- <div align="center">
- <table class="format">
- <caption>
- Symbolic Link Scratch-pad Format
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Symbolic Link Scratch-pad Format</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Offset to Link Value</td>
+ <td colspan="4">Offset to Link Value</td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Offset to Link Value</p></td>
- <td>
- <p>The value of a symbolic link (that is, the name of the
- thing to which it points) is stored in the local heap.
- This field is the 4-byte offset into the local heap for
- the start of the link value, which is null terminated.
- </p>
- </td>
+ <td><p>Offset to Link Value</p></td>
+ <td>
+ <p>The value of a symbolic link (that is, the name of the thing
+ to which it points) is stored in the local heap. This field is the
+ 4-byte offset into the local heap for the start of the link value,
+ which is null terminated.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
<br />
-<h3><a name="LocalHeap">
-III.D. Disk Format: Level 1D - Local Heaps</a></h3>
+<h3>
+ <a name="LocalHeap"> III.D. Disk Format: Level 1D - Local Heaps</a>
+</h3>
- <p>A local heap is a collection of small pieces of data that are particular
- to a single object in the HDF5 file. Objects can be
- inserted and removed from the heap at any time.
- The address of a heap does not change once the heap is created.
- For example, a group stores addresses of objects in symbol table nodes
- with the names of links stored in the group&rsquo;s local heap.
- </p>
+<p>A local heap is a collection of small pieces of data that are
+ particular to a single object in the HDF5 file. Objects can be inserted
+ and removed from the heap at any time. The address of a heap does not
+ change once the heap is created. For example, a group stores addresses
+ of objects in symbol table nodes with the names of links stored in the
+ group&rsquo;s local heap.</p>
- <div align="center">
- <table class="format">
- <caption>
- Local Heap
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Local Heap</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version</td>
- <td colspan="3">Reserved (zero)</td>
+ <td>Version</td>
+ <td colspan="3">Reserved (zero)</td>
</tr>
<tr>
- <td colspan="4"><br />Data Segment Size<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Data Segment Size<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Offset to Head of Free-list<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Offset to Head of Free-list<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Address of Data Segment<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Data Segment<sup>O</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>HEAP</code>&rdquo;
- is used to indicate the
- beginning of a heap. This gives file consistency
- checking utilities a better chance of reconstructing a
- damaged file.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>HEAP</code>
+ &rdquo; is used to indicate the beginning of a heap. This gives
+ file consistency checking utilities a better chance of
+ reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>Each local heap has its own version number so that new
- heaps can be added to old files. This document
- describes version zero (0) of the local heap.
- </p>
- </td>
+ <td><p>Version</p></td>
+ <td>
+ <p>Each local heap has its own version number so that new heaps
+ can be added to old files. This document describes version zero (0)
+ of the local heap.</p>
+ </td>
</tr>
<tr>
- <td><p>Data Segment Size</p></td>
- <td>
- <p>The total amount of disk memory allocated for the heap
- data. This may be larger than the amount of space
- required by the objects stored in the heap. The extra
- unused space in the heap holds a linked list of free blocks.
- </p>
- </td>
+ <td><p>Data Segment Size</p></td>
+ <td>
+ <p>The total amount of disk memory allocated for the heap data.
+ This may be larger than the amount of space required by the objects
+ stored in the heap. The extra unused space in the heap holds a
+ linked list of free blocks.</p>
+ </td>
</tr>
<tr>
- <td><p>Offset to Head of Free-list</p></td>
- <td>
- <p>This is the offset within the heap data segment of the
- first free block (or the
- <a href="#UndefinedAddress">undefined address</a> if there is no
- free block). The free block contains &ldquo;Size of Lengths&rdquo; bytes that
- are the offset of the next free block (or the
- value &lsquo;1&rsquo; if this is the
- last free block) followed by &ldquo;Size of Lengths&rdquo; bytes that store
- the size of this free block. The size of the free block includes
- the space used to store the offset of the next free block and
- the size of the current block, making the minimum size of a free
- block 2 * &ldquo;Size of Lengths&rdquo;.
- </p>
- </td>
+ <td><p>Offset to Head of Free-list</p></td>
+ <td>
+ <p>
+ This is the offset within the heap data segment of the first free
+ block (or the <a href="#UndefinedAddress">undefined address</a> if
+ there is no free block). The free block contains &ldquo;Size of
+ Lengths&rdquo; bytes that are the offset of the next free block (or
+ the value &lsquo;1&rsquo; if this is the last free block) followed
+ by &ldquo;Size of Lengths&rdquo; bytes that store the size of this
+ free block. The size of the free block includes the space used to
+ store the offset of the next free block and the size of the current
+ block, making the minimum size of a free block 2 * &ldquo;Size of
+ Lengths&rdquo;.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Address of Data Segment</p></td>
- <td>
- <p>The data segment originally starts immediately after
- the heap header, but if the data segment must grow as a
- result of adding more objects, then the data segment may
- be relocated, in its entirety, to another part of the
- file.
- </p>
- </td>
+ <td><p>Address of Data Segment</p></td>
+ <td>
+ <p>The data segment originally starts immediately after the heap
+ header, but if the data segment must grow as a result of adding
+ more objects, then the data segment may be relocated, in its
+ entirety, to another part of the file.</p>
+ </td>
</tr>
- </table>
- </div>
-
- <p>Objects within a local heap should be aligned on an 8-byte boundary.</p>
-
-<br />
-<h3><a name="GlobalHeap">
-III.E. Disk Format: Level 1E - Global Heap</a></h3>
-
- <p>Each HDF5 file has a global heap which stores various types of
- information which is typically shared between datasets. The
- global heap was designed to satisfy these goals:</p>
-
- <ol type="A">
- <li>Repeated access to a heap object must be efficient without
- resulting in repeated file I/O requests. Since global heap
- objects will typically be shared among several datasets, it is
- probable that the object will be accessed repeatedly.</li>
- <li>Collections of related global heap objects should result in
- fewer and larger I/O requests. For instance, a dataset of
- object references will have a global heap object for each
- reference. Reading the entire set of object references
- should result in a few large I/O requests instead of one small
- I/O request for each reference.</li>
- <li>It should be possible to remove objects from the global heap
- and the resulting file hole should be eligible to be reclaimed
- for other uses.</li>
- </ol>
-
-
- <p>The implementation of the heap makes use of the memory management
- already available at the file level and combines that with a new
- object called a <em>collection</em> to achieve goal B. The global heap
- is the set of all collections. Each global heap object belongs to
- exactly one collection and each collection contains one or more global
- heap objects. For the purposes of disk I/O and caching, a collection is
- treated as an atomic object, addressing goal A.
- </p>
-
- <p>When a global heap object is deleted from a collection (which occurs
- when its reference count falls to zero), objects located after the
- deleted object in the collection are packed down toward the beginning
- of the collection and the collection&rsquo;s global heap object 0 is created
- (if possible) or its size is increased to account for the recently
- freed space. There are no gaps between objects in each collection,
- with the possible exception of the final space in the collection, if
- it is not large enough to hold the header for the collection&rsquo;s global
- heap object 0. These features address goal C.
- </p>
-
- <p>The HDF5 Library creates global heap collections as needed, so there may
- be multiple collections throughout the file. The set of all of them is
- abstractly called the &ldquo;global heap&rdquo;, although they do not actually link
- to each other, and there is no global place in the file where you can
- discover all of the collections. The collections are found simply by
- finding a reference to one through another object in the file. For
- example, data of variable-length datatype elements is stored in the
- global heap and is accessed via a global heap ID. The format for
- global heap IDs is described at the end of this section.
- </p>
-
- <div align="center">
- <table class="format">
- <caption>
- A Global Heap Collection
- </caption>
+ </table>
+</div>
+
+<p>Objects within a local heap should be aligned on an 8-byte
+ boundary.</p>
+
+<br />
+<h3>
+ <a name="GlobalHeap"> III.E. Disk Format: Level 1E - Global Heap</a>
+</h3>
+
+<p>Each HDF5 file has a global heap which stores various types of
+ information which is typically shared between datasets. The global heap
+ was designed to satisfy these goals:</p>
+
+<ol type="A">
+ <li>Repeated access to a heap object must be efficient without
+ resulting in repeated file I/O requests. Since global heap objects
+ will typically be shared among several datasets, it is probable that
+ the object will be accessed repeatedly.</li>
+ <li>Collections of related global heap objects should result in
+ fewer and larger I/O requests. For instance, a dataset of object
+ references will have a global heap object for each reference. Reading
+ the entire set of object references should result in a few large I/O
+ requests instead of one small I/O request for each reference.</li>
+ <li>It should be possible to remove objects from the global heap
+ and the resulting file hole should be eligible to be reclaimed for
+ other uses.</li>
+</ol>
+
+
+<p>
+ The implementation of the heap makes use of the memory management
+ already available at the file level and combines that with a new object
+ called a <em>collection</em> to achieve goal B. The global heap is the
+ set of all collections. Each global heap object belongs to exactly one
+ collection and each collection contains one or more global heap
+ objects. For the purposes of disk I/O and caching, a collection is
+ treated as an atomic object, addressing goal A.
+</p>
+
+<p>When a global heap object is deleted from a collection (which
+ occurs when its reference count falls to zero), objects located after
+ the deleted object in the collection are packed down toward the
+ beginning of the collection and the collection&rsquo;s global heap
+ object 0 is created (if possible) or its size is increased to account
+ for the recently freed space. There are no gaps between objects in each
+ collection, with the possible exception of the final space in the
+ collection, if it is not large enough to hold the header for the
+ collection&rsquo;s global heap object 0. These features address goal C.
+</p>
+
+<p>The HDF5 Library creates global heap collections as needed, so
+ there may be multiple collections throughout the file. The set of all
+ of them is abstractly called the &ldquo;global heap&rdquo;, although
+ they do not actually link to each other, and there is no global place
+ in the file where you can discover all of the collections. The
+ collections are found simply by finding a reference to one through
+ another object in the file. For example, data of variable-length
+ datatype elements is stored in the global heap and is accessed via a
+ global heap ID. The format for global heap IDs is described at the end
+ of this section.</p>
+
+<div align="center">
+ <table class="format">
+ <caption>A Global Heap Collection</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version</td>
- <td colspan="3">Reserved (zero)</td>
+ <td>Version</td>
+ <td colspan="3">Reserved (zero)</td>
</tr>
<tr>
- <td colspan="4"><br />Collection Size<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Collection Size<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Global Heap Object 1<br /><br /></td>
+ <td colspan="4"><br />Global Heap Object 1<br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Global Heap Object 2<br /><br /></td>
+ <td colspan="4"><br />Global Heap Object 2<br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />...<br /><br /></td>
+ <td colspan="4"><br />...<br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Global Heap Object <em>N</em><br /><br /></td>
+ <td colspan="4"><br />Global Heap Object <em>N</em><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Global Heap Object 0 (free space)<br /><br /></td>
+ <td colspan="4"><br />Global Heap Object 0 (free space)<br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Lengths&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>GCOL</code>&rdquo;
- is used to indicate the
- beginning of a collection. This gives file consistency
- checking utilities a better chance of reconstructing a
- damaged file.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>GCOL</code>
+ &rdquo; is used to indicate the beginning of a collection. This
+ gives file consistency checking utilities a better chance of
+ reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>Each collection has its own version number so that new
- collections can be added to old files. This document
- describes version one (1) of the collections (there is no
- version zero (0)).
- </p>
- </td>
+ <td><p>Version</p></td>
+ <td>
+ <p>Each collection has its own version number so that new
+ collections can be added to old files. This document describes
+ version one (1) of the collections (there is no version zero (0)).
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Collection Size</p></td>
- <td>
- <p>This is the size in bytes of the entire collection
- including this field. The default (and minimum)
- collection size is 4096 bytes which is a typical file
- system block size. This allows for 127 16-byte heap
- objects plus their overhead (the collection header of 16 bytes
- and the 16 bytes of information about each heap object).
- </p>
- </td>
+ <td><p>Collection Size</p></td>
+ <td>
+ <p>This is the size in bytes of the entire collection including
+ this field. The default (and minimum) collection size is 4096 bytes
+ which is a typical file system block size. This allows for 127
+ 16-byte heap objects plus their overhead (the collection header of
+ 16 bytes and the 16 bytes of information about each heap object).</p>
+ </td>
</tr>
<tr>
- <td><p>Global Heap Object 1 through <em>N</em></p></td>
- <td>
- <p>The objects are stored in any order with no
- intervening unused space.
- </p>
- </td>
+ <td><p>
+ Global Heap Object 1 through <em>N</em>
+ </p></td>
+ <td>
+ <p>The objects are stored in any order with no intervening
+ unused space.</p>
+ </td>
</tr>
<tr>
- <td><p>Global Heap Object 0</p></td>
- <td>
- <p>Global Heap Object 0 (zero), when present, represents the free
- space in the collection. Free space always appears at the end of
- the collection. If the free space is too small to store the header
- for Object 0 (described below) then the header is implied and the
- collection contains no free space.
- </p>
- </td>
+ <td><p>Global Heap Object 0</p></td>
+ <td>
+ <p>Global Heap Object 0 (zero), when present, represents the
+ free space in the collection. Free space always appears at the end
+ of the collection. If the free space is too small to store the
+ header for Object 0 (described below) then the header is implied
+ and the collection contains no free space.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Global Heap Object
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Global Heap Object</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="2">Heap Object Index</td>
- <td colspan="2">Reference Count</td>
+ <td colspan="2">Heap Object Index</td>
+ <td colspan="2">Reference Count</td>
</tr>
<tr>
- <td colspan="4">Reserved (zero)</td>
+ <td colspan="4">Reserved (zero)</td>
</tr>
<tr>
- <td colspan="4"><br />Object Size<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Object Size<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Object Data<br /><br /></td>
+ <td colspan="4"><br />Object Data<br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Lengths&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Heap Object Index</p></td>
- <td>
- <p>Each object has a unique identification number within a
- collection. The identification numbers are chosen so that
- new objects have the smallest value possible with the
- exception that the identifier <code>0</code> always refers to the
- object which represents all free space within the
- collection.
- </p>
- </td>
+ <td><p>Heap Object Index</p></td>
+ <td>
+ <p>
+ Each object has a unique identification number within a collection.
+ The identification numbers are chosen so that new objects have the
+ smallest value possible with the exception that the identifier
+ <code>0</code>
+ always refers to the object which represents all free space within
+ the collection.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Reference Count</p></td>
- <td>
- <p>All heap objects have a reference count field. An
- object which is referenced from some other part of the
- file will have a positive reference count. The reference
- count for Object 0 is always zero.
- </p>
- </td>
+ <td><p>Reference Count</p></td>
+ <td>
+ <p>All heap objects have a reference count field. An object
+ which is referenced from some other part of the file will have a
+ positive reference count. The reference count for Object 0 is
+ always zero.</p>
+ </td>
</tr>
<tr>
- <td><p>Reserved</p></td>
- <td>
- <p>Zero padding to align next field on an 8-byte boundary.
- </p>
- </td>
+ <td><p>Reserved</p></td>
+ <td>
+ <p>Zero padding to align next field on an 8-byte boundary.</p>
+ </td>
</tr>
<tr>
- <td><p>Object Size</p></td>
- <td>
- <p>This is the size of the object data stored for the object.
- The actual storage space allocated for the object data is rounded
- up to a multiple of eight.
- </p>
- </td>
+ <td><p>Object Size</p></td>
+ <td>
+ <p>This is the size of the object data stored for the object.
+ The actual storage space allocated for the object data is rounded
+ up to a multiple of eight.</p>
+ </td>
</tr>
<tr>
- <td><p>Object Data</p></td>
- <td>
- <p>The object data is treated as a one-dimensional array
- of bytes to be interpreted by the caller.
- </p>
- </td>
+ <td><p>Object Data</p></td>
+ <td>
+ <p>The object data is treated as a one-dimensional array of
+ bytes to be interpreted by the caller.</p>
+ </td>
</tr>
- </table>
+ </table>
- </div>
+</div>
- <br />
- <p>
- The format for the ID used to locate an object in the global heap is
- described here:</p>
+<br />
+<p>The format for the ID used to locate an object in the global heap
+ is described here:</p>
- <div align="center">
- <table class="format">
- <caption>
- Global Heap ID
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Global Heap ID</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Collection Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Collection Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Object Index</td>
+ <td colspan="4">Object Index</td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Collection Address</p></td>
- <td>
- <p>This field is the address of the global heap collection
- where the data object is stored.
- </p>
- </td>
+ <td><p>Collection Address</p></td>
+ <td>
+ <p>This field is the address of the global heap collection where
+ the data object is stored.</p>
+ </td>
</tr>
<tr>
- <td><p>ID</p></td>
- <td>
- <p>This field is the index of the data object within the
- global heap collection.
- </p>
- </td>
+ <td><p>ID</p></td>
+ <td>
+ <p>This field is the index of the data object within the global
+ heap collection.</p>
+ </td>
</tr>
- </table>
- </div>
-
-
-<br />
-<h3><a name="FractalHeap">
-III.F. Disk Format: Level 1F - Fractal Heap</a></h3>
-
- <p>
- Each fractal heap consists of a header and zero or more direct and
- indirect blocks (described below). The header contains general
- information as well as
- initialization parameters for the doubling table. The <em>Root
- Block Address</em> in the header points to the first direct or
- indirect block in the heap.
- </p>
-
- <p>
- Fractal heaps are based on a data structure called a <em>doubling
- table</em>. A doubling table provides a mechanism for quickly
- extending an array-like data structure that minimizes the number of
- empty blocks in the heap, while retaining very fast lookup of any
- element within the array. More information on fractal heaps and
- doubling tables can be found in the RFC
- &ldquo;<a href="Supplements/FractalHeap/PrivateHeap.pdf">Private
- Heaps in HDF5</a>.&rdquo;
- </p>
-
- <p>
- The fractal heap implements the doubling table structure with
- indirect and direct blocks.
- Indirect blocks in the heap do not actually contain data for
- objects in the heap, their &ldquo;size&rdquo; is abstract -
- they represent the indexing structure for locating the
- direct blocks in the doubling table.
- Direct blocks
- contain the actual data for objects stored in the heap.
- </p>
-
- <p>
- All indirect blocks have a constant number of block entries in each
- row, called the <em>width</em> of the doubling table (stored in
- the heap header).
-
- The number
- of rows for each indirect block in the heap is determined by the
- size of the block that the indirect block represents in the
- doubling table (calculation of this is shown below) and is
- constant, except for the &ldquo;root&rdquo;
- indirect block, which expands and shrinks its number of rows as
- needed.
- </p>
-
- <p>
- Blocks in the first <em>two</em> rows of an indirect block
- are <em>Starting Block Size</em> number of bytes in size,
- and the blocks in each subsequent row are twice the size of
- the blocks in the previous row. In other words, blocks in
- the third row are twice the <em>Starting Block Size</em>,
- blocks in the fourth row are four times the
- <em>Starting Block Size</em>, and so on. Entries for
- blocks up to the <em>Maximum Direct Block Size</em> point to
- direct blocks, and entries for blocks greater than that size
- point to further indirect blocks (which have their own
- entries for direct and indirect blocks).
- </p>
-
- <p>
- The number of rows of blocks, <em>nrows</em>, in an
- indirect block of size <em>iblock_size</em> is given by the
- following expression:
- <br /> <br />
- <em>nrows</em> = (log<sub>2</sub>(<em>iblock_size</em>) -
- log<sub>2</sub>(<em>&lt;Starting Block Size&gt;</em> *
- <em>&lt;Width&gt;</em>)) + 1
- </p>
-
- <p>
- The maximum number of rows of direct blocks, <em>max_dblock_rows</em>,
- in any indirect block of a fractal heap is given by the
- following expression:
- <br /> <br />
- <em>max_dblock_rows</em> =
- (log<sub>2</sub>(<em>&lt;Max. Direct Block Size&gt;</em>) -
- log<sub>2</sub>(<em>&lt;Starting Block Size&gt;</em>)) + 2
- </p>
-
- <p>
- Using the computed values for <em>nrows</em> and
- <em>max_dblock_rows</em>, along with the <em>Width</em> of the
- doubling table, the number of direct and indirect block entries
- (<em>K</em> and <em>N</em> in the indirect block description, below)
- in an indirect block can be computed:
- <br /> <br />
- <em>K</em> = MIN(<em>nrows</em>, <em>max_dblock_rows</em>) *
- <em>Width</em>
-
- <br /> <br />
- If <em>nrows</em> is less than or equal to <em>max_dblock_rows</em>,
- <em>N</em> is 0. Otherwise, <em>N</em> is simply computed:
- <br /> <br />
- <em>N</em> = <em>K</em> - (<em>max_dblock_rows</em> *
- <em>Width</em>)
- </p>
-
- <p>
- The size indirect blocks on disk is determined by the number
- of rows in the indirect block (computed above). The size of direct
- blocks on disk is exactly the size of the block in the doubling
- table.
- </p>
-
- <div align="center">
- <table class="format">
- <caption>
- Fractal Heap Header
- </caption>
+ </table>
+</div>
+
+
+<br />
+<h3>
+ <a name="FractalHeap"> III.F. Disk Format: Level 1F - Fractal Heap</a>
+</h3>
+
+<p>
+ Each fractal heap consists of a header and zero or more direct and
+ indirect blocks (described below). The header contains general
+ information as well as initialization parameters for the doubling
+ table. The <em>Root Block Address</em> in the header points to the
+ first direct or indirect block in the heap.
+</p>
+
+<p>
+ Fractal heaps are based on a data structure called a <em>doubling
+ table</em>. A doubling table provides a mechanism for quickly extending an
+ array-like data structure that minimizes the number of empty blocks in
+ the heap, while retaining very fast lookup of any element within the
+ array. More information on fractal heaps and doubling tables can be
+ found in the RFC &ldquo;<a
+ href="Supplements/FractalHeap/PrivateHeap.pdf">Private Heaps in
+ HDF5</a>.&rdquo;
+</p>
+
+<p>The fractal heap implements the doubling table structure with
+ indirect and direct blocks. Indirect blocks in the heap do not actually
+ contain data for objects in the heap, their &ldquo;size&rdquo; is
+ abstract - they represent the indexing structure for locating the
+ direct blocks in the doubling table. Direct blocks contain the actual
+ data for objects stored in the heap.</p>
+
+<p>
+ All indirect blocks have a constant number of block entries in each
+ row, called the <em>width</em> of the doubling table (stored in the
+ heap header). The number of rows for each indirect block in the heap is
+ determined by the size of the block that the indirect block represents
+ in the doubling table (calculation of this is shown below) and is
+ constant, except for the &ldquo;root&rdquo; indirect block, which
+ expands and shrinks its number of rows as needed.
+</p>
+
+<p>
+ Blocks in the first <em>two</em> rows of an indirect block are <em>Starting
+ Block Size</em> number of bytes in size, and the blocks in each subsequent
+ row are twice the size of the blocks in the previous row. In other
+ words, blocks in the third row are twice the <em>Starting Block
+ Size</em>, blocks in the fourth row are four times the <em>Starting
+ Block Size</em>, and so on. Entries for blocks up to the <em>Maximum
+ Direct Block Size</em> point to direct blocks, and entries for blocks
+ greater than that size point to further indirect blocks (which have
+ their own entries for direct and indirect blocks).
+</p>
+
+<p>
+ The number of rows of blocks, <em>nrows</em>, in an indirect block of
+ size <em>iblock_size</em> is given by the following expression: <br />
+ <br /> <em>nrows</em> = (log<sub>2</sub>(<em>iblock_size</em>) - log<sub>2</sub>(<em>&lt;Starting
+ Block Size&gt;</em> * <em>&lt;Width&gt;</em>)) + 1
+</p>
+
+<p>
+ The maximum number of rows of direct blocks, <em>max_dblock_rows</em>,
+ in any indirect block of a fractal heap is given by the following
+ expression: <br /> <br /> <em>max_dblock_rows</em> = (log<sub>2</sub>(<em>&lt;Max.
+ Direct Block Size&gt;</em>) - log<sub>2</sub>(<em>&lt;Starting Block
+ Size&gt;</em>)) + 2
+</p>
+
+<p>
+ Using the computed values for <em>nrows</em> and <em>max_dblock_rows</em>,
+ along with the <em>Width</em> of the doubling table, the number of
+ direct and indirect block entries (<em>K</em> and <em>N</em> in the
+ indirect block description, below) in an indirect block can be
+ computed: <br /> <br /> <em>K</em> = MIN(<em>nrows</em>, <em>max_dblock_rows</em>)
+ * <em>Width</em> <br /> <br /> If <em>nrows</em> is less than or
+ equal to <em>max_dblock_rows</em>, <em>N</em> is 0. Otherwise, <em>N</em>
+ is simply computed: <br /> <br /> <em>N</em> = <em>K</em> - (<em>max_dblock_rows</em>
+ * <em>Width</em>)
+</p>
+
+<p>The size indirect blocks on disk is determined by the number of
+ rows in the indirect block (computed above). The size of direct blocks
+ on disk is exactly the size of the block in the doubling table.</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap Header</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td>Version</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="2">Heap ID Length</td>
- <td colspan="2">I/O Filters&rsquo; Encoded Length</td>
+ <td colspan="2">Heap ID Length</td>
+ <td colspan="2">I/O Filters&rsquo; Encoded Length</td>
</tr>
<tr>
- <td>Flags</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td>Flags</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4">Maximum Size of Managed Objects</td>
+ <td colspan="4">Maximum Size of Managed Objects</td>
</tr>
<tr>
- <td colspan="4"><br />Next Huge Object ID<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Next Huge Object ID<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />v2 B-tree Address of Huge Objects<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />v2 B-tree Address of Huge Objects<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Amount of Free Space in Managed Blocks<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Amount of Free Space in Managed Blocks<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Address of Managed Block Free Space Manager<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Managed Block Free Space
+ Manager<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Amount of Managed Space in Heap<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Amount of Managed Space in Heap<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Amount of Allocated Managed Space in Heap<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Amount of Allocated Managed Space in Heap<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Offset of Direct Block Allocation Iterator in Managed Space<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Offset of Direct Block Allocation
+ Iterator in Managed Space<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Number of Managed Objects in Heap<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Number of Managed Objects in Heap<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Size of Huge Objects in Heap<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Size of Huge Objects in Heap<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Number of Huge Objects in Heap<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Number of Huge Objects in Heap<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Size of Tiny Objects in Heap<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Size of Tiny Objects in Heap<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Number of Tiny Objects in Heap<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Number of Tiny Objects in Heap<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="2">Table Width</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan="2">Table Width</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4"><br />Starting Block Size<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Starting Block Size<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Maximum Direct Block Size<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Maximum Direct Block Size<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="2">Maximum Heap Size</td>
- <td colspan="2">Starting # of Rows in Root Indirect Block</td>
+ <td colspan="2">Maximum Heap Size</td>
+ <td colspan="2">Starting # of Rows in Root Indirect Block</td>
</tr>
<tr>
- <td colspan="4"><br />Address of Root Block<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address of Root Block<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="2">Current # of Rows in Root Indirect Block</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan="2">Current # of Rows in Root Indirect Block</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4"><br />Size of Filtered Root Direct Block <em>(optional)</em><sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Size of Filtered Root Direct Block <em>(optional)</em><sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">I/O Filter Mask<em> (optional)</em></td>
+ <td colspan="4">I/O Filter Mask<em> (optional)</em></td>
</tr>
<tr>
- <td colspan="4">I/O Filter Information<em> (optional, variable size)</em></td>
+ <td colspan="4">I/O Filter Information<em> (optional,
+ variable size)</em></td>
</tr>
<tr>
- <td colspan="4">Checksum</td>
+ <td colspan="4">Checksum</td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="40%">Field Name</th>
- <th>Description</th>
+ <th width="40%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>FRHP</code>&rdquo;
- is used to indicate the
- beginning of a fractal heap header. This gives file consistency
- checking utilities a better chance of reconstructing a
- damaged file.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>FRHP</code>
+ &rdquo; is used to indicate the beginning of a fractal heap header.
+ This gives file consistency checking utilities a better chance of
+ reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>This document describes version 0.</p>
- </td>
+ <td><p>Version</p></td>
+ <td>
+ <p>This document describes version 0.</p>
+ </td>
</tr>
<tr>
- <td><p>Heap ID Length</p></td>
- <td>
- <p>This is the length in bytes of heap object IDs for this heap.</p>
- </td>
+ <td><p>Heap ID Length</p></td>
+ <td>
+ <p>This is the length in bytes of heap object IDs for this heap.</p>
+ </td>
</tr>
<tr>
- <td><p>I/O Filters&rsquo; Encoded Length</p></td>
- <td>
- <p>This is the size in bytes of the encoded <em>I/O Filter Information</em>.
- </p>
- </td>
+ <td><p>I/O Filters&rsquo; Encoded Length</p></td>
+ <td>
+ <p>
+ This is the size in bytes of the encoded <em>I/O Filter
+ Information</em>.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Flags</p></td>
- <td>
- <p>This field is the heap status flag and is a bit field
- indicating additional information about the fractal heap.
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit(s)</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set, the ID value to use for huge object has wrapped
- around. If the value for the <em>Next Huge Object ID</em>
- has wrapped around, each new huge object inserted into the
- heap will require a search for an ID value.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>If set, the direct blocks in the heap are checksummed.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2-7</code></td>
- <td>Reserved</td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Maximum Size of Managed Objects</p></td>
- <td>
- <p>This is the maximum size of managed objects allowed in the heap.
- Objects greater than this this are &lsquo;huge&rsquo; objects and will be
- stored in the file directly, rather than in a direct block for
- the heap.
- </p>
- </td>
+ <td><p>Flags</p></td>
+ <td>
+ <p>This field is the heap status flag and is a bit field
+ indicating additional information about the fractal heap.</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit(s)</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set, the ID value to use for huge object has wrapped
+ around. If the value for the <em>Next Huge Object ID</em> has
+ wrapped around, each new huge object inserted into the heap will
+ require a search for an ID value.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>If set, the direct blocks in the heap are checksummed.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>2-7</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
</tr>
<tr>
- <td><p>Next Huge Object ID</p></td>
- <td>
- <p>This is the next ID value to use for a huge object in the heap.
- </p>
- </td>
+ <td><p>Maximum Size of Managed Objects</p></td>
+ <td>
+ <p>This is the maximum size of managed objects allowed in the
+ heap. Objects greater than this this are &lsquo;huge&rsquo; objects
+ and will be stored in the file directly, rather than in a direct
+ block for the heap.</p>
+ </td>
</tr>
<tr>
- <td><p>v2 B-tree Address of Huge Objects</p></td>
- <td>
- <p>This is the address of the <a href="#V2Btrees">v2 B-tree</a>
- used to track huge objects in the heap. The type of records
- stored in the <em>v2 B-tree</em> will
- be determined by whether the address & length of a huge object
- can fit into a heap ID (if yes, it is a &ldquo;directly&rdquo; accessed
- huge object) and whether there is a filter used on objects
- in the heap.
- </p>
- </td>
+ <td><p>Next Huge Object ID</p></td>
+ <td>
+ <p>This is the next ID value to use for a huge object in the
+ heap.</p>
+ </td>
</tr>
<tr>
- <td><p>Amount of Free Space in Managed Blocks</p></td>
- <td>
- <p>This is the total amount of free space in managed direct blocks
- (in bytes).
- </p>
- </td>
+ <td><p>v2 B-tree Address of Huge Objects</p></td>
+ <td>
+ <p>
+ This is the address of the <a href="#V2Btrees">v2 B-tree</a> used
+ to track huge objects in the heap. The type of records stored in
+ the <em>v2 B-tree</em> will be determined by whether the address &
+ length of a huge object can fit into a heap ID (if yes, it is a
+ &ldquo;directly&rdquo; accessed huge object) and whether there is a
+ filter used on objects in the heap.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Address of Managed Block Free Space Manager</p></td>
- <td>
- <p>This is the address of the
- <em><a href="#FreeSpaceManager">Free-space Manager</a></em> for
- managed blocks.
- </p>
- </td>
+ <td><p>Amount of Free Space in Managed Blocks</p></td>
+ <td>
+ <p>This is the total amount of free space in managed direct
+ blocks (in bytes).</p>
+ </td>
</tr>
<tr>
- <td><p>Amount of Managed Space in Heap</p></td>
- <td>
- <p>This is the total amount of managed space in the heap (in bytes),
- essentially the upper bound of the heap&rsquo;s linear address space.
- </p>
- </td>
+ <td><p>Address of Managed Block Free Space Manager</p></td>
+ <td>
+ <p>
+ This is the address of the <em><a href="#FreeSpaceManager">Free-space
+ Manager</a></em> for managed blocks.
+ </p>
+ </td>
</tr>
- <tr>
- <td><p>Amount of Allocated Managed Space in Heap</p></td>
- <td>
- <p>This is the total amount of managed space (in bytes) actually
- allocated in
- the heap. This can be less than the <em>Amount of Managed Space
- in Heap</em> field, if some direct blocks in the heap&rsquo;s linear
- address space are not allocated.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Offset of Direct Block Allocation Iterator in Managed Space</p></td>
- <td>
- <p>This is the linear heap offset where the next direct
- block should be allocated at (in bytes). This may be less than
- the <em>Amount of Managed Space in Heap</em> value because the
- heap&rsquo;s address space is increased by a &ldquo;row&rdquo; of direct blocks
- at a time, rather than by single direct block increments.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Number of Managed Objects in Heap</p></td>
- <td>
- <p>This is the number of managed objects in the heap.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Huge Objects in Heap</p></td>
- <td>
- <p>This is the total size of huge objects in the heap (in bytes).
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Number of Huge Objects in Heap</p></td>
- <td>
- <p>This is the number of huge objects in the heap.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Tiny Objects in Heap</p></td>
- <td>
- <p>This is the total size of tiny objects that are packed in heap
- IDs (in bytes).
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Number of Tiny Objects in Heap</p></td>
- <td>
- <p>This is the number of tiny objects that are packed in heap IDs.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Table Width</p></td>
- <td>
- <p>This is the number of columns in the doubling table for managed
- blocks. This value must be a power of two.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Starting Block Size</p></td>
- <td>
- <p>This is the starting block size to use in the doubling table for
- managed blocks (in bytes). This value must be a power of two.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Maximum Direct Block Size</p></td>
- <td>
- <p>This is the maximum size allowed for a managed direct block.
- Objects inserted into the heap that are larger than this value
- (less the # of bytes of direct block prefix/suffix)
- are stored as &lsquo;huge&rsquo; objects. This value must be a power of
- two.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Maximum Heap Size</p></td>
- <td>
- <p>This is the maximum size of the heap&rsquo;s linear address space for
- managed objects (in bytes). The value stored is the log2 of
- the actual value, that is: the # of bits of the address space.
- &lsquo;Huge&rsquo; and &lsquo;tiny&rsquo; objects are not counted in this value, since
- they do not store objects in the linear address space of the
- heap.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Starting # of Rows in Root Indirect Block</p></td>
- <td>
- <p>This is the starting number of rows for the root indirect block.
- A value of 0 indicates that the root indirect block will have
- the maximum number of rows needed to address the heap&rsquo;s <em>Maximum
- Heap Size</em>.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Address of Root Block</p></td>
- <td>
- <p>This is the address of the root block for the heap. It can
- be the <a href="#UndefinedAddress">undefined address</a> if
- there is no data in the heap. It either points to a direct
- block (if the <em>Current # of Rows in the Root Indirect Block</em>
- value is 0), or an indirect block.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Current # of Rows in Root Indirect Block</p></td>
- <td>
- <p>This is the current number of rows in the root indirect block.
- A value of 0 indicates that <em>Address of Root Block</em>
- points to direct block instead of indirect block.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Filtered Root Direct Block</p></td>
- <td>
- <p>This is the size of the root direct block, if filters are
- applied to heap objects (in bytes). This field is only
- stored in the header if the <em>I/O Filters&rsquo; Encoded Length</em>
- is greater than 0.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>I/O Filter Mask</p></td>
- <td>
- <p>This is the filter mask for the root direct block, if filters
- are applied to heap objects. This mask has the same format as
- that used for the filter mask in chunked raw data records in a
- <a href="#V1Btrees">v1 B-tree</a>.
- This field is only
- stored in the header if the <em>I/O Filters&rsquo; Encoded Length</em>
- is greater than 0.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>I/O Filter Information</p></td>
- <td>
- <p>This is the I/O filter information encoding direct blocks and
- huge objects, if filters are applied to heap objects. This
- field is encoded as a <a href="#FilterMessage">Filter Pipeline</a>
- message.
- The size of this field is determined by <em>I/O Filters&rsquo;
- Encoded Length</em>.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the header.</p>
- </td>
+ <tr>
+ <td><p>Amount of Managed Space in Heap</p></td>
+ <td>
+ <p>This is the total amount of managed space in the heap (in
+ bytes), essentially the upper bound of the heap&rsquo;s linear
+ address space.</p>
+ </td>
</tr>
- </table>
- </div>
+ <tr>
+ <td><p>Amount of Allocated Managed Space in Heap</p></td>
+ <td>
+ <p>
+ This is the total amount of managed space (in bytes) actually
+ allocated in the heap. This can be less than the <em>Amount of
+ Managed Space in Heap</em> field, if some direct blocks in the
+ heap&rsquo;s linear address space are not allocated.
+ </p>
+ </td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fractal Heap Direct Block
- </caption>
+ <tr>
+ <td><p>Offset of Direct Block Allocation Iterator in Managed
+ Space</p></td>
+ <td>
+ <p>
+ This is the linear heap offset where the next direct block should
+ be allocated at (in bytes). This may be less than the <em>Amount
+ of Managed Space in Heap</em> value because the heap&rsquo;s address
+ space is increased by a &ldquo;row&rdquo; of direct blocks at a
+ time, rather than by single direct block increments.
+ </p>
+ </td>
+ </tr>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <td><p>Number of Managed Objects in Heap</p></td>
+ <td>
+ <p>This is the number of managed objects in the heap.</p>
+ </td>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td><p>Size of Huge Objects in Heap</p></td>
+ <td>
+ <p>This is the total size of huge objects in the heap (in
+ bytes).</p>
+ </td>
</tr>
<tr>
- <td>Version</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td><p>Number of Huge Objects in Heap</p></td>
+ <td>
+ <p>This is the number of huge objects in the heap.</p>
+ </td>
</tr>
<tr>
- <td colspan="4"><br />Heap Header Address<sup>O</sup><br /><br /></td>
+ <td><p>Size of Tiny Objects in Heap</p></td>
+ <td>
+ <p>This is the total size of tiny objects that are packed in
+ heap IDs (in bytes).</p>
+ </td>
</tr>
<tr>
- <td colspan="4">Block Offset <em>(variable size)</em></td>
+ <td><p>Number of Tiny Objects in Heap</p></td>
+ <td>
+ <p>This is the number of tiny objects that are packed in heap
+ IDs.</p>
+ </td>
</tr>
<tr>
- <td colspan="4">Checksum <em>(optional)</em></td>
+ <td><p>Table Width</p></td>
+ <td>
+ <p>This is the number of columns in the doubling table for
+ managed blocks. This value must be a power of two.</p>
+ </td>
</tr>
<tr>
- <td colspan="4"><br />Object Data <em>(variable size)</em><br /><br /></td>
+ <td><p>Starting Block Size</p></td>
+ <td>
+ <p>This is the starting block size to use in the doubling table
+ for managed blocks (in bytes). This value must be a power of two.</p>
+ </td>
</tr>
- </table>
+ <tr>
+ <td><p>Maximum Direct Block Size</p></td>
+ <td>
+ <p>This is the maximum size allowed for a managed direct block.
+ Objects inserted into the heap that are larger than this value
+ (less the # of bytes of direct block prefix/suffix) are stored as
+ &lsquo;huge&rsquo; objects. This value must be a power of two.</p>
+ </td>
+ </tr>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td><p>Maximum Heap Size</p></td>
+ <td>
+ <p>This is the maximum size of the heap&rsquo;s linear address
+ space for managed objects (in bytes). The value stored is the log2
+ of the actual value, that is: the # of bits of the address space.
+ &lsquo;Huge&rsquo; and &lsquo;tiny&rsquo; objects are not counted
+ in this value, since they do not store objects in the linear
+ address space of the heap.</p>
+ </td>
+ </tr>
- </div>
+ <tr>
+ <td><p>Starting # of Rows in Root Indirect Block</p></td>
+ <td>
+ <p>
+ This is the starting number of rows for the root indirect block. A
+ value of 0 indicates that the root indirect block will have the
+ maximum number of rows needed to address the heap&rsquo;s <em>Maximum
+ Heap Size</em>.
+ </p>
+ </td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <tr>
+ <td><p>Address of Root Block</p></td>
+ <td>
+ <p>
+ This is the address of the root block for the heap. It can be the <a
+ href="#UndefinedAddress">undefined address</a> if there is no data
+ in the heap. It either points to a direct block (if the <em>Current
+ # of Rows in the Root Indirect Block</em> value is 0), or an indirect
+ block.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>FHDB</code>&rdquo;
- is used to indicate the
- beginning of a fractal heap direct block. This gives file consistency
- checking utilities a better chance of reconstructing a
- damaged file.
- </p>
- </td>
+ <td><p>Current # of Rows in Root Indirect Block</p></td>
+ <td>
+ <p>
+ This is the current number of rows in the root indirect block. A
+ value of 0 indicates that <em>Address of Root Block</em> points to
+ direct block instead of indirect block.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size of Filtered Root Direct Block</p></td>
+ <td>
+ <p>
+ This is the size of the root direct block, if filters are applied
+ to heap objects (in bytes). This field is only stored in the header
+ if the <em>I/O Filters&rsquo; Encoded Length</em> is greater than
+ 0.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>This document describes version 0.</p>
- </td>
+ <td><p>I/O Filter Mask</p></td>
+ <td>
+ <p>
+ This is the filter mask for the root direct block, if filters are
+ applied to heap objects. This mask has the same format as that used
+ for the filter mask in chunked raw data records in a <a
+ href="#V1Btrees">v1 B-tree</a>. This field is only stored in the
+ header if the <em>I/O Filters&rsquo; Encoded Length</em> is greater
+ than 0.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Heap Header Address</p></td>
- <td>
- <p>This is the address for the fractal heap header that this
- block belongs to. This field is principally used for file
- integrity checking.
- </p>
- </td>
+ <td><p>I/O Filter Information</p></td>
+ <td>
+ <p>
+ This is the I/O filter information encoding direct blocks and huge
+ objects, if filters are applied to heap objects. This field is
+ encoded as a <a href="#FilterMessage">Filter Pipeline</a> message.
+ The size of this field is determined by <em>I/O Filters&rsquo;
+ Encoded Length</em>.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Block Offset</p></td>
- <td>
- <p>This is the offset of the block within the fractal heap&rsquo;s
- address space (in bytes). The number of bytes used to encode
- this field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
- header) divided by 8 and rounded up to the next highest integer,
- for values that are not a multiple of 8. This value is
- principally used for file integrity checking.
- </p>
- </td>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the header.</p>
+ </td>
</tr>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap Direct Block</caption>
+
<tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the direct block.</p>
- <p>This field is only present if bit 1 of <em>Flags</em> in the
- heap&rsquo;s header is set.</p>
- </td>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td><p>Object Data</p></td>
- <td>
- <p>This section of the direct block stores the actual data for
- objects in the heap. The size of this section is determined by
- the direct block&rsquo;s size minus the size of the other fields
- stored in the direct block (for example, the <em>Signature</em>,
- <em>Version</em>, and others including the <em>Checksum</em> if it is
- present).
- </p>
- </td>
+ <td colspan="4">Signature</td>
</tr>
- </table>
- </div>
+ <tr>
+ <td>Version</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fractal Heap Indirect Block
- </caption>
+ <tr>
+ <td colspan="4"><br />Heap Header Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <td colspan="4">Block Offset <em>(variable size)</em></td>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Checksum <em>(optional)</em></td>
</tr>
<tr>
- <td>Version</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan="4"><br />Object Data <em>(variable size)</em><br />
+ <br /></td>
</tr>
+ </table>
+
+ <table class="note">
<tr>
- <td colspan="4"><br />Heap Header Address<sup>O</sup><br /><br /></td>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
</tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <td colspan="4">Block Offset <em>(variable size)</em></td>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td colspan="4"><br />Child Direct Block #0 Address<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Size of Filtered Direct Block #0 <em>(optional)</em> <sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">Filter Mask for Direct Block #0 <em>(optional)</em></td>
- </tr>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>FHDB</code>
+ &rdquo; is used to indicate the beginning of a fractal heap direct
+ block. This gives file consistency checking utilities a better
+ chance of reconstructing a damaged file.
+ </p>
+ </td>
+ </tr>
<tr>
- <td colspan="4"><br />Child Direct Block #1 Address<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Size of Filtered Direct Block #1 <em>(optional)</em><sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">Filter Mask for Direct Block #1 <em>(optional)</em></td>
- </tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>This document describes version 0.</p>
+ </td>
+ </tr>
- <tr>
- <td colspan="4">...</td>
- </tr>
+ <tr>
+ <td><p>Heap Header Address</p></td>
+ <td>
+ <p>This is the address for the fractal heap header that this
+ block belongs to. This field is principally used for file integrity
+ checking.</p>
+ </td>
+ </tr>
<tr>
- <td colspan="4"><br />Child Direct Block #K-1 Address<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Size of Filtered Direct Block #K-1 <em>(optional)</em><sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">Filter Mask for Direct Block #K-1 <em>(optional)</em></td>
- </tr>
+ <td><p>Block Offset</p></td>
+ <td>
+ <p>
+ This is the offset of the block within the fractal heap&rsquo;s
+ address space (in bytes). The number of bytes used to encode this
+ field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
+ header) divided by 8 and rounded up to the next highest integer,
+ for values that are not a multiple of 8. This value is principally
+ used for file integrity checking.
+ </p>
+ </td>
+ </tr>
<tr>
- <td colspan="4"><br />Child Indirect Block #0 Address<sup>O</sup><br /><br /></td>
- </tr>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the direct block.</p>
+ <p>
+ This field is only present if bit 1 of <em>Flags</em> in the
+ heap&rsquo;s header is set.
+ </p>
+ </td>
+ </tr>
<tr>
- <td colspan="4"><br />Child Indirect Block #1 Address<sup>O</sup><br /><br /></td>
- </tr>
+ <td><p>Object Data</p></td>
+ <td>
+ <p>
+ This section of the direct block stores the actual data for objects
+ in the heap. The size of this section is determined by the direct
+ block&rsquo;s size minus the size of the other fields stored in the
+ direct block (for example, the <em>Signature</em>, <em>Version</em>,
+ and others including the <em>Checksum</em> if it is present).
+ </p>
+ </td>
+ </tr>
- <tr>
- <td colspan="4">...</td>
- </tr>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap Indirect Block</caption>
<tr>
- <td colspan="4"><br />Child Indirect Block #N-1 Address<sup>O</sup><br /><br /></td>
- </tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
<tr>
- <td colspan="4">Checksum</td>
+ <td colspan="4">Signature</td>
</tr>
- </table>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td>Version</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td colspan="4"><br />Heap Header Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
- </div>
+ <tr>
+ <td colspan="4">Block Offset <em>(variable size)</em></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <tr>
+ <td colspan="4"><br />Child Direct Block #0 Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Size of Filtered Direct Block #0 <em>(optional)</em>
+ <sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">Filter Mask for Direct Block #0 <em>(optional)</em></td>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>FHIB</code>&rdquo; is used to
- indicate the beginning of a fractal heap indirect block. This
- gives file consistency checking utilities a better chance of
- reconstructing a damaged file.
- </p>
- </td>
+ <td colspan="4"><br />Child Direct Block #1 Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Size of Filtered Direct Block #1 <em>(optional)</em><sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">Filter Mask for Direct Block #1 <em>(optional)</em></td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>This document describes version 0.</p>
- </td>
+ <td colspan="4">...</td>
</tr>
<tr>
- <td><p>Heap Header Address</p></td>
- <td>
- <p>This is the address for the fractal heap header that this
- block belongs to. This field is principally used for file
- integrity checking.
- </p>
- </td>
+ <td colspan="4"><br />Child Direct Block #K-1 Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Size of Filtered Direct Block #K-1 <em>(optional)</em><sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">Filter Mask for Direct Block #K-1 <em>(optional)</em></td>
</tr>
<tr>
- <td><p>Block Offset</p></td>
- <td>
- <p>This is the offset of the block within the fractal heap&rsquo;s
- address space (in bytes). The number of bytes used to encode
- this field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
- header) divided by 8 and rounded up to the next highest integer,
- for values that are not a multiple of 8. This value is
- principally used for file integrity checking.
- </p>
- </td>
+ <td colspan="4"><br />Child Indirect Block #0 Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td><p>Child Direct Block #K Address</p></td>
- <td>
- <p>This field is the address of the child direct block.
- The size of the [uncompressed] direct block can be computed by
- its offset in the heap&rsquo;s linear address space.
- </p>
- </td>
+ <td colspan="4"><br />Child Indirect Block #1 Address<sup>O</sup><br />
+ <br /></td>
</tr>
- <tr>
- <td><p>Size of Filtered Direct Block #K</p></td>
- <td>
- <p>This is the size of the child direct block after passing through
- the I/O filters defined for this heap (in bytes). If no I/O
- filters are present for this heap, this field is not present.
- </p>
- </td>
- </tr>
- <tr>
- <td><p>Filter Mask for Direct Block #K</p></td>
- <td>
- <p>This is the I/O filter mask for the filtered direct block.
- This mask has the same format as that used for the filter mask
- in chunked raw data records in a <a href="#V1Btrees">v1 B-tree</a>.
- If no I/O filters are present for this heap, this field is not
- present.
- </p>
- </td>
+ <tr>
+ <td colspan="4">...</td>
</tr>
<tr>
- <td><p>Child Indirect Block #N Address</p></td>
- <td>
- <p>This field is the address of the child indirect block.
- The size of the indirect block can be computed by
- its offset in the heap&rsquo;s linear address space.
- </p>
- </td>
+ <td colspan="4"><br />Child Indirect Block #N-1 Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the indirect block.</p>
- </td>
+ <td colspan="4">Checksum</td>
</tr>
+ </table>
- </table>
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <p>An object in the fractal heap is identified by means of a fractal heap ID,
- which encodes information to locate the object in the heap.
- Currently, the fractal heap stores an object in one of three ways,
- depending on the object&rsquo;s size:</p>
-
- <div align="center">
- <table class="list80">
- <tr>
- <th width="20%">Type</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center">Tiny</td>
- <td>
- <p>When an object is small enough to be encoded in the heap ID, the
- object&rsquo;s data is embedded in the fractal heap ID itself. There are
- 2 sub-types for this type of object: normal and extended. The
- sub-type for tiny heap IDs depends on whether the heap ID is large
- enough to store objects greater than 16 bytes or not. If the
- heap ID length is 18 bytes or smaller, the &lsquo;normal&rsquo; tiny heap ID
- form is used. If the heap ID length is greater than 18 bytes in
- length, the &ldquo;extended&rdquo; form is used. See format description below
- for both sub-types.
- </p>
- </td>
- </tr>
-
- <tr>
- <td align="center">Huge</td>
- <td>
- <p>When the size of an object is larger than <em>Maximum Size of
- Managed Objects</em> in the <em>Fractal Heap Header</em>, the
- object&rsquo;s data is stored on its own in the file and the object
- is tracked/indexed via a version 2 B-tree. All huge objects
- for a particular fractal heap use the same v2 B-tree. All huge
- objects for a particular fractal heap use the same format for
- their huge object IDs.
- </p>
-
- <p>Depending on whether the IDs for a heap are large enough to hold
- the object&rsquo;s retrieval information and whether I/O pipeline filters
- are applied to the heap&rsquo;s objects, 4 sub-types are derived for
- huge object IDs for this heap:</p>
-
- <div align="center">
- <table class="list">
- <tr>
- <th align="left" width="35%">Sub-type</th>
- <th align="left">Description</th>
- </tr>
-
- <tr>
- <td align="left">Directly accessed, non-filtered</td>
- <td>
- <p>The object&rsquo;s address and length are embedded in the
- fractal heap ID itself and the object is directly accessed
- from them. This allows the object to be accessed without
- resorting to the B-tree.
- </p>
- </td>
- </tr>
-
- <tr>
- <td align="left">Directly accessed, filtered</td>
- <td>
- <p>The filtered object&rsquo;s address, length, filter mask and
- de-filtered size are embedded in the fractal heap ID itself
- and the object is accessed directly with them. This allows
- the object to be accessed without resorting to the B-tree.
- </p>
- </td>
- </tr>
-
- <tr>
- <td align="left">Indirectly accessed, non-filtered</td>
- <td>
- <p>The object is located by using a B-tree key embedded in
- the fractal heap ID to retrieve the address and length from
- the version 2 B-tree for huge objects. Then, the address
- and length are used to access the object.
- </p>
- </td>
- </tr>
-
- <tr>
- <td align="left">Indirectly accessed, filtered</td>
- <td>
- <p>The object is located by using a B-tree key embedded in
- the fractal heap ID to retrieve the filtered object&rsquo;s
- address, length, filter mask and de-filtered size from the
- version 2 B-tree for huge objects. Then, this information
- is used to access the object.
- </p>
- </td>
- </tr>
- </table>
- </div>
-
- </td>
- </tr>
-
- <tr>
- <td align="center">Managed</td>
- <td>
- <p>When the size of an object does not meet the above two
- conditions, the object is stored and managed via the direct and
- indirect blocks based on the doubling table.
- </p>
- </td>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
- </table>
- </div>
+ <tr>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>FHIB</code>
+ &rdquo; is used to indicate the beginning of a fractal heap
+ indirect block. This gives file consistency checking utilities a
+ better chance of reconstructing a damaged file.
+ </p>
+ </td>
+ </tr>
- <p>The specific format for each type of heap ID is described below:
- </p>
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>This document describes version 0.</p>
+ </td>
+ </tr>
- <div align="center">
- <table class="format">
- <caption>Fractal Heap ID for Tiny Objects (sub-type 1 - &lsquo;Normal&rsquo;)
- </caption>
+ <tr>
+ <td><p>Heap Header Address</p></td>
+ <td>
+ <p>This is the address for the fractal heap header that this
+ block belongs to. This field is principally used for file integrity
+ checking.</p>
+ </td>
+ </tr>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
+ <td><p>Block Offset</p></td>
+ <td>
+ <p>
+ This is the offset of the block within the fractal heap&rsquo;s
+ address space (in bytes). The number of bytes used to encode this
+ field is the <em>Maximum Heap Size</em> (in the heap&rsquo;s
+ header) divided by 8 and rounded up to the next highest integer,
+ for values that are not a multiple of 8. This value is principally
+ used for file integrity checking.
+ </p>
+ </td>
+ </tr>
<tr>
- <td>Version, Type & Length</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td><p>Child Direct Block #K Address</p></td>
+ <td>
+ <p>This field is the address of the child direct block. The size
+ of the [uncompressed] direct block can be computed by its offset in
+ the heap&rsquo;s linear address space.</p>
+ </td>
</tr>
<tr>
- <td colspan="4"><br />Data <em>(variable size)</em></td>
+ <td><p>Size of Filtered Direct Block #K</p></td>
+ <td>
+ <p>This is the size of the child direct block after passing
+ through the I/O filters defined for this heap (in bytes). If no I/O
+ filters are present for this heap, this field is not present.</p>
+ </td>
+ </tr>
+ <tr>
+ <td><p>Filter Mask for Direct Block #K</p></td>
+ <td>
+ <p>
+ This is the I/O filter mask for the filtered direct block. This
+ mask has the same format as that used for the filter mask in
+ chunked raw data records in a <a href="#V1Btrees">v1 B-tree</a>. If
+ no I/O filters are present for this heap, this field is not
+ present.
+ </p>
+ </td>
</tr>
- </table>
- </div>
+ <tr>
+ <td><p>Child Indirect Block #N Address</p></td>
+ <td>
+ <p>This field is the address of the child indirect block. The
+ size of the indirect block can be computed by its offset in the
+ heap&rsquo;s linear address space.</p>
+ </td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version, Type & Length</p></td>
- <td>
- <p>This is a bit field with the following definition:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>6-7</code></td>
- <td>The current version of ID format. This document
- describes version 0.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4-5</code></td>
- <td>The ID type. Tiny objects have a value of <code>2</code>.
- </td>
- </tr>
- <tr>
- <td align="center"><code>0-3</code></td>
- <td>The length of the tiny object. The value stored
- is one less than the actual length (since zero-length
- objects are not allowed to be stored in the heap).
- For example, an object of actual length 1 has an
- encoded length of 0, an object of actual length 2
- has an encoded length of 1, and so on.
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Data</p></td>
- <td>
- <p>This is the data for the object.
- </p>
- </td>
+ <tr>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the indirect block.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>Fractal Heap ID for Tiny Objects (sub-type 2 - &lsquo;Extended&rsquo;)
- </caption>
+</div>
+
+<br />
+<p>An object in the fractal heap is identified by means of a fractal
+ heap ID, which encodes information to locate the object in the heap.
+ Currently, the fractal heap stores an object in one of three ways,
+ depending on the object&rsquo;s size:</p>
+
+<div align="center">
+ <table class="list80">
+ <tr>
+ <th width="20%">Type</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center">Tiny</td>
+ <td>
+ <p>When an object is small enough to be encoded in the heap ID,
+ the object&rsquo;s data is embedded in the fractal heap ID itself.
+ There are 2 sub-types for this type of object: normal and extended.
+ The sub-type for tiny heap IDs depends on whether the heap ID is
+ large enough to store objects greater than 16 bytes or not. If the
+ heap ID length is 18 bytes or smaller, the &lsquo;normal&rsquo;
+ tiny heap ID form is used. If the heap ID length is greater than 18
+ bytes in length, the &ldquo;extended&rdquo; form is used. See
+ format description below for both sub-types.</p>
+ </td>
+ </tr>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
+ <td align="center">Huge</td>
+ <td>
+ <p>
+ When the size of an object is larger than <em>Maximum Size of
+ Managed Objects</em> in the <em>Fractal Heap Header</em>, the
+ object&rsquo;s data is stored on its own in the file and the object
+ is tracked/indexed via a version 2 B-tree. All huge objects for a
+ particular fractal heap use the same v2 B-tree. All huge objects
+ for a particular fractal heap use the same format for their huge
+ object IDs.
+ </p>
+
+ <p>Depending on whether the IDs for a heap are large enough to
+ hold the object&rsquo;s retrieval information and whether I/O
+ pipeline filters are applied to the heap&rsquo;s objects, 4
+ sub-types are derived for huge object IDs for this heap:</p>
+
+ <div align="center">
+ <table class="list">
+ <tr>
+ <th align="left" width="35%">Sub-type</th>
+ <th align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="left">Directly accessed, non-filtered</td>
+ <td>
+ <p>The object&rsquo;s address and length are embedded in the
+ fractal heap ID itself and the object is directly accessed from
+ them. This allows the object to be accessed without resorting
+ to the B-tree.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="left">Directly accessed, filtered</td>
+ <td>
+ <p>The filtered object&rsquo;s address, length, filter mask
+ and de-filtered size are embedded in the fractal heap ID itself
+ and the object is accessed directly with them. This allows the
+ object to be accessed without resorting to the B-tree.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="left">Indirectly accessed, non-filtered</td>
+ <td>
+ <p>The object is located by using a B-tree key embedded in
+ the fractal heap ID to retrieve the address and length from the
+ version 2 B-tree for huge objects. Then, the address and length
+ are used to access the object.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="left">Indirectly accessed, filtered</td>
+ <td>
+ <p>The object is located by using a B-tree key embedded in
+ the fractal heap ID to retrieve the filtered object&rsquo;s
+ address, length, filter mask and de-filtered size from the
+ version 2 B-tree for huge objects. Then, this information is
+ used to access the object.</p>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ </td>
+ </tr>
<tr>
- <td>Version, Type & Length</td>
- <td>Extended Length</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td align="center">Managed</td>
+ <td>
+ <p>When the size of an object does not meet the above two
+ conditions, the object is stored and managed via the direct and
+ indirect blocks based on the doubling table.</p>
+ </td>
</tr>
+ </table>
+</div>
+
+
+<p>The specific format for each type of heap ID is described below:
+</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap ID for Tiny Objects (sub-type 1 -
+ &lsquo;Normal&rsquo;)</caption>
<tr>
- <td colspan="4">Data <em>(variable size)</em></td>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
- </table>
- </div>
+ <tr>
+ <td>Version, Type & Length</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version, Type & Length</p></td>
- <td>
- <p>This is a bit field with the following definition:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>6-7</code></td>
- <td>The current version of ID format. This document
- describes version 0.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4-5</code></td>
- <td>The ID type. Tiny objects have a value of <code>2</code>.
- </td>
- </tr>
- <tr>
- <td align="center"><code>0-3</code></td>
- <td>These 4 bits, together with the next byte, form an
- unsigned 12-bit integer for holding the length of the
- object. These 4-bits are bits 8-11 of the 12-bit integer.
- See description for the <em>Extended Length</em> field below.
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Extended Length</p></td>
- <td>
- <p>This byte, together with the 4 bits in the previous byte,
- forms an unsigned 12-bit integer for holding the length of
- the tiny object. These 8 bits are bits 0-7 of the 12-bit
- integer formed. The value stored is one less than the actual
- length (since zero-length objects are not allowed to be
- stored in the heap). For example, an object of actual length
- 1 has an encoded length of 0, an object of actual length
- 2 has an encoded length of 1, and so on.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Data</p></td>
- <td>
- <p>This is the data for the object.
- </p>
- </td>
+ <tr>
+ <td colspan="4"><br />Data <em>(variable size)</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>Fractal Heap ID for Huge Objects (sub-type 1 & 2): indirectly accessed, non-filtered/filtered
- </caption>
+ <tr>
+ <td><p>Version, Type & Length</p></td>
+ <td>
+ <p>This is a bit field with the following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>6-7</code></td>
+ <td>The current version of ID format. This document describes
+ version 0.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>4-5</code></td>
+ <td>The ID type. Tiny objects have a value of <code>2</code>.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>0-3</code></td>
+ <td>The length of the tiny object. The value stored is one
+ less than the actual length (since zero-length objects are not
+ allowed to be stored in the heap). For example, an object of
+ actual length 1 has an encoded length of 0, an object of actual
+ length 2 has an encoded length of 1, and so on.</td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
+ </tr>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <td><p>Data</p></td>
+ <td>
+ <p>This is the data for the object.</p>
+ </td>
</tr>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap ID for Tiny Objects (sub-type 2 -
+ &lsquo;Extended&rsquo;)</caption>
+
<tr>
- <td>Version & Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />v2 B-tree Key<sup>L</sup><em> (variable size)</em><br /><br /></td>
+ <td>Version, Type & Length</td>
+ <td>Extended Length</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
- </table>
+ <tr>
+ <td colspan="4">Data <em>(variable size)</em></td>
+ </tr>
+
+ </table>
+</div>
- <table class="note">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
- </div>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <td><p>Version, Type & Length</p></td>
+ <td>
+ <p>This is a bit field with the following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>6-7</code></td>
+ <td>The current version of ID format. This document describes
+ version 0.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>4-5</code></td>
+ <td>The ID type. Tiny objects have a value of <code>2</code>.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>0-3</code></td>
+ <td>These 4 bits, together with the next byte, form an
+ unsigned 12-bit integer for holding the length of the object.
+ These 4-bits are bits 8-11 of the 12-bit integer. See description
+ for the <em>Extended Length</em> field below.
+ </td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Extended Length</p></td>
+ <td>
+ <p>This byte, together with the 4 bits in the previous byte,
+ forms an unsigned 12-bit integer for holding the length of the tiny
+ object. These 8 bits are bits 0-7 of the 12-bit integer formed. The
+ value stored is one less than the actual length (since zero-length
+ objects are not allowed to be stored in the heap). For example, an
+ object of actual length 1 has an encoded length of 0, an object of
+ actual length 2 has an encoded length of 1, and so on.</p>
+ </td>
</tr>
<tr>
- <td><p>Version & Type</p></td>
- <td>
- <p>This is a bit field with the following definition:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
+ <td><p>Data</p></td>
+ <td>
+ <p>This is the data for the object.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
- <tr>
- <td align="center"><code>6-7</code></td>
- <td>The current version of ID format. This document
- describes version 0.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4-5</code></td>
- <td>The ID type. Huge objects have a value of <code>1</code>.
- </td>
- </tr>
- <tr>
- <td align="center"><code>0-3</code></td>
- <td>Reserved.
- </td>
- </tr>
- </table></p>
- </td>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap ID for Huge Objects (sub-type 1 & 2):
+ indirectly accessed, non-filtered/filtered</caption>
+
+ <tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td><p>v2 B-tree Key</p></td>
- <td><p>This field is the B-tree key for retrieving the information
- from the version 2 B-tree for huge objects needed to access the
- object. See the description of <a href="#V2Btrees">v2 B-tree</a>
- records sub-type 1 & 2 for a description of the fields. New key
- values are derived from <em>Next Huge Object ID</em> in the
- <em>Fractal Heap Header</em>.</p>
+ <td>Version & Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />v2 B-tree Key<sup>L</sup><em>
+ (variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Lengths&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version & Type</p></td>
+ <td>
+ <p>This is a bit field with the following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>6-7</code></td>
+ <td>The current version of ID format. This document describes
+ version 0.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>4-5</code></td>
+ <td>The ID type. Huge objects have a value of <code>1</code>.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>0-3</code></td>
+ <td>Reserved.</td>
+ </tr>
+ </table>
+ <p></p>
+
</td>
</tr>
- </table>
- </div>
+ <tr>
+ <td><p>v2 B-tree Key</p></td>
+ <td><p>
+ This field is the B-tree key for retrieving the information from
+ the version 2 B-tree for huge objects needed to access the object.
+ See the description of <a href="#V2Btrees">v2 B-tree</a> records
+ sub-type 1 & 2 for a description of the fields. New key values are
+ derived from <em>Next Huge Object ID</em> in the <em>Fractal
+ Heap Header</em>.
+ </p></td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>Fractal Heap ID for Huge Objects (sub-type 3): directly accessed, non-filtered
- </caption>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap ID for Huge Objects (sub-type 3):
+ directly accessed, non-filtered</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td>Version & Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td>Version & Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4"><br />Address <sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address <sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Length <sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Length <sup>L</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Version & Type</p></td>
- <td>
- <p>This is a bit field with the following definition:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
+ <td><p>Version & Type</p></td>
+ <td>
+ <p>This is a bit field with the following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <tr>
- <td align="center"><code>6-7</code></td>
- <td>The current version of ID format. This document
- describes version 0.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4-5</code></td>
- <td>The ID type. Huge objects have a value of <code>1</code>.
- </td>
- </tr>
- <tr>
- <td align="center"><code>0-3</code></td>
- <td>Reserved.
- </td>
- </tr>
- </table></p>
+ <tr>
+ <td align="center"><code>6-7</code></td>
+ <td>The current version of ID format. This document describes
+ version 0.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>4-5</code></td>
+ <td>The ID type. Huge objects have a value of <code>1</code>.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>0-3</code></td>
+ <td>Reserved.</td>
+ </tr>
+ </table>
+ <p></p>
- </td>
+ </td>
</tr>
<tr>
@@ -5362,2899 +5492,2913 @@ III.F. Disk Format: Level 1F - Fractal Heap</a></h3>
<tr>
<td><p>Length</p></td>
- <td><p>This field is the length of the object in the file.</p>
- </td>
+ <td><p>This field is the length of the object in the file.</p></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>Fractal Heap ID for Huge Objects (sub-type 4): directly accessed, filtered
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap ID for Huge Objects (sub-type 4):
+ directly accessed, filtered</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td>Version & Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td>Version & Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4"><br />Address <sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Address <sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Length <sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Length <sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Filter Mask</td>
+ <td colspan="4">Filter Mask</td>
</tr>
<tr>
- <td colspan="4"><br />De-filtered Size <sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />De-filtered Size <sup>L</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
</tr>
<tr>
- <td>&nbsp;</td>
- <td>(Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Version & Type</p></td>
- <td>
- <p>This is a bit field with the following definition:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
+ <td><p>Version & Type</p></td>
+ <td>
+ <p>This is a bit field with the following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <tr>
- <td align="center"><code>6-7</code></td>
- <td>The current version of ID format. This document
- describes version 0.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4-5</code></td>
- <td>The ID type. Huge objects have a value of <code>1</code>.
- </td>
- </tr>
- <tr>
- <td align="center"><code>0-3</code></td>
- <td>Reserved.
- </td>
- </tr>
- </table></p>
+ <tr>
+ <td align="center"><code>6-7</code></td>
+ <td>The current version of ID format. This document describes
+ version 0.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>4-5</code></td>
+ <td>The ID type. Huge objects have a value of <code>1</code>.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>0-3</code></td>
+ <td>Reserved.</td>
+ </tr>
+ </table>
+ <p></p>
- </td>
+ </td>
</tr>
<tr>
<td><p>Address</p></td>
- <td><p>This field is the address of the filtered object in the file.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Length</p></td>
- <td><p>This field is the length of the filtered object in the file.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Filter Mask</p></td>
- <td><p>This field is the I/O pipeline filter mask for the
- filtered object in the file.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Filtered Size</p></td>
- <td><p>This field is the size of the de-filtered object in the file.</p>
- </td>
- </tr>
+ <td><p>This field is the address of the filtered object in
+ the file.</p></td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Length</p></td>
+ <td><p>This field is the length of the filtered object in
+ the file.</p></td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>Fractal Heap ID for Managed Objects
- </caption>
+ <tr>
+ <td><p>Filter Mask</p></td>
+ <td><p>This field is the I/O pipeline filter mask for the
+ filtered object in the file.</p></td>
+ </tr>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
+ <td><p>Filtered Size</p></td>
+ <td><p>This field is the size of the de-filtered object in
+ the file.</p></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap ID for Managed Objects</caption>
<tr>
- <td>Version & Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
+
<tr>
- <td colspan="4">Offset <em>(variable size)</em></td>
+ <td>Version & Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+ <tr>
+ <td colspan="4">Offset <em>(variable size)</em></td>
</tr>
<tr>
- <td colspan="4">Length <em>(variable size)</em></td>
+ <td colspan="4">Length <em>(variable size)</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version & Type</p></td>
- <td><p>This is a bit field with the following definition:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>6-7</code></td>
- <td>The current version of ID format. This document
- describes version 0.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4-5</code></td>
- <td>The ID type. Managed objects have a value of <code>0</code>.
- </td>
- </tr>
- <tr>
- <td align="center"><code>0-3</code></td>
- <td>Reserved.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Offset</p></td>
- <td><p>This field is the offset of the object in the heap.
- This field&rsquo;s size is the minimum number of bytes
- necessary to encode the <em>Maximum Heap Size</em> value
- (from the <em>Fractal Heap Header</em>). For example, if the
- value of the <em>Maximum Heap Size</em> is less than 256 bytes,
- this field is 1 byte in length, a <em>Maximum Heap Size</em>
- of 256-65535 bytes uses a 2 byte length, and so on.</p></td>
- </tr>
-
- <tr>
- <td><p>Length</p></td>
- <td><p>This field is the length of the object in the heap. It
- is determined by taking the minimum value of <em>Maximum
- Direct Block Size</em> and <em>Maximum Size of Managed
- Objects</em> in the <em>Fractal Heap Header</em>. Again,
- the minimum number of bytes needed to encode that value is
- used for the size of this field.</p></td>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
- </table>
- </div>
-
-<br />
-<h3><a name="FreeSpaceManager">
-III.G. Disk Format: Level 1G - Free-space Manager</a></h3>
-
- <p>
- Free-space managers are used to describe space within a heap or
- the entire HDF5 file that is not currently used for that heap or
- file.
- </p>
-
- <p>
- The <em>free-space manager header</em> contains metadata information
- about the space being tracked, along with the address of the list
- of <em>free space sections</em> which actually describes the free
- space. The header records information about free-space sections being
- tracked, creation parameters for handling free-space sections of a
- client, and section information used to locate the collection of
- free-space sections.
- </p>
-
- <p>
- The <em>free-space section list</em> stores a collection of
- free-space sections that is specific to each <em>client</em> of the
- free-space manager.
-
- For example, the fractal heap is a client of the free space manager
- and uses it to track unused space within the heap. There are 4
- types of section records for the fractal heap, each of which has
- its own format, listed below.
- </p>
-
- <div align="center">
- <table class="format">
- <caption>
- Free-space Manager Header
- </caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <td><p>Version & Type</p></td>
+ <td><p>This is a bit field with the following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>6-7</code></td>
+ <td>The current version of ID format. This document describes
+ version 0.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>4-5</code></td>
+ <td>The ID type. Managed objects have a value of <code>0</code>.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>0-3</code></td>
+ <td>Reserved.</td>
+ </tr>
+ </table>
+ <p></p></td>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td><p>Offset</p></td>
+ <td><p>
+ This field is the offset of the object in the heap. This
+ field&rsquo;s size is the minimum number of bytes necessary to
+ encode the <em>Maximum Heap Size</em> value (from the <em>Fractal
+ Heap Header</em>). For example, if the value of the <em>Maximum
+ Heap Size</em> is less than 256 bytes, this field is 1 byte in length,
+ a <em>Maximum Heap Size</em> of 256-65535 bytes uses a 2 byte
+ length, and so on.
+ </p></td>
</tr>
<tr>
- <td>Version</td>
- <td>Client ID</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td><p>Length</p></td>
+ <td><p>
+ This field is the length of the object in the heap. It is
+ determined by taking the minimum value of <em>Maximum Direct
+ Block Size</em> and <em>Maximum Size of Managed Objects</em> in the <em>Fractal
+ Heap Header</em>. Again, the minimum number of bytes needed to encode
+ that value is used for the size of this field.
+ </p></td>
</tr>
+ </table>
+</div>
+
+<br />
+<h3>
+ <a name="FreeSpaceManager"> III.G. Disk Format: Level 1G -
+ Free-space Manager</a>
+</h3>
+
+<p>Free-space managers are used to describe space within a heap or
+ the entire HDF5 file that is not currently used for that heap or file.
+</p>
+
+<p>
+ The <em>free-space manager header</em> contains metadata information
+ about the space being tracked, along with the address of the list of <em>free
+ space sections</em> which actually describes the free space. The header
+ records information about free-space sections being tracked, creation
+ parameters for handling free-space sections of a client, and section
+ information used to locate the collection of free-space sections.
+</p>
+
+<p>
+ The <em>free-space section list</em> stores a collection of free-space
+ sections that is specific to each <em>client</em> of the free-space
+ manager. For example, the fractal heap is a client of the free space
+ manager and uses it to track unused space within the heap. There are 4
+ types of section records for the fractal heap, each of which has its
+ own format, listed below.
+</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Free-space Manager Header</caption>
<tr>
- <td colspan="4"><br />Total Space Tracked<sup>L</sup><br /><br /></td>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4"><br />Total Number of Sections<sup>L</sup><br /><br /></td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td colspan="4"><br />Number of Serialized Sections<sup>L</sup><br /><br /></td>
- </tr>
+ <td>Version</td>
+ <td>Client ID</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4"><br />Number of Un-Serialized Sections<sup>L</sup><br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Total Space Tracked<sup>L</sup><br />
+ <br /></td>
+ </tr>
- <tr>
- <td colspan="2">Number of Section Classes</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Total Number of Sections<sup>L</sup><br />
+ <br /></td>
+ </tr>
<tr>
- <td colspan="2">Shrink Percent</td>
- <td colspan="2">Expand Percent</td>
+ <td colspan="4"><br />Number of Serialized Sections<sup>L</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="2">Size of Address Space</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <td colspan="4"><br />Number of Un-Serialized Sections<sup>L</sup><br />
+ <br /></td>
+ </tr>
<tr>
- <td colspan="4"><br />Maximum Section Size <sup>L</sup><br /><br /></td>
- </tr>
+ <td colspan="2">Number of Section Classes</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
<tr>
- <td colspan="4"><br />Address of Serialized Section List<sup>O</sup><br /><br /></td>
+ <td colspan="2">Shrink Percent</td>
+ <td colspan="2">Expand Percent</td>
</tr>
<tr>
- <td colspan="4"><br />Size of Serialized Section List Used<sup>L</sup><br /><br /></td>
+ <td colspan="2">Size of Address Space</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4"><br />Allocated Size of Serialized Section List<sup>L</sup><br /><br /></td>
- </tr>
+ <td colspan="4"><br />Maximum Section Size <sup>L</sup><br />
+ <br /></td>
+ </tr>
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
+ <tr>
+ <td colspan="4"><br />Address of Serialized Section List<sup>O</sup><br />
+ <br /></td>
+ </tr>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td colspan="4"><br />Size of Serialized Section List Used<sup>L</sup><br />
+ <br /></td>
+ </tr>
+
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td colspan="4"><br />Allocated Size of Serialized Section List<sup>L</sup><br />
+ <br /></td>
+ </tr>
- </div>
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="35%">Field Name</th>
- <th>Description</th>
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
</tr>
+ </table>
+
+</div>
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>FSHD</code>&rdquo; is used to
- indicate the beginning of the Free-space Manager Header.
- This gives file consistency checking utilities a better chance of
- reconstructing a damaged file.
- </p>
- </td>
+ <th width="35%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>This is the version number for the Free-space Manager Header
- and this document describes version 0.</p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>FSHD</code>
+ &rdquo; is used to indicate the beginning of the Free-space Manager
+ Header. This gives file consistency checking utilities a better
+ chance of reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Client ID</p></td>
- <td>
- <p>This is the client ID for identifying the user of this
- free-space manager:
+ <td><p>Version</p></td>
+ <td>
+ <p>This is the version number for the Free-space Manager Header
+ and this document describes version 0.</p>
+ </td>
+ </tr>
+ <tr>
+ <td><p>Client ID</p></td>
+ <td>
+ <p>This is the client ID for identifying the user of this
+ free-space manager:</p>
<table class="list">
<tr>
- <th width="20%" align="center">ID</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">ID</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>Fractal heap
- </td>
+ <td align="center"><code>0</code></td>
+ <td>Fractal heap</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>File
- </td>
+ <td align="center"><code>1</code></td>
+ <td>File</td>
</tr>
<tr>
- <td align="center"><code>2+</code></td>
- <td>Reserved.
- </td>
+ <td align="center"><code>2+</code></td>
+ <td>Reserved.</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- </td>
+ </td>
</tr>
- <tr>
- <td><p>Total Space Tracked</p></td>
- <td>
- <p>This is the total amount of free space being tracked, in bytes.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>Total Space Tracked</p></td>
+ <td>
+ <p>This is the total amount of free space being tracked, in
+ bytes.</p>
+ </td>
+ </tr>
<tr>
- <td><p>Total Number of Sections</p></td>
- <td>
- <p>This is the total number of free-space sections being tracked.
- </p>
- </td>
+ <td><p>Total Number of Sections</p></td>
+ <td>
+ <p>This is the total number of free-space sections being
+ tracked.</p>
+ </td>
</tr>
- <tr>
- <td><p>Number of Serialized Sections</p></td>
- <td>
- <p>This is the number of serialized free-space sections being
- tracked.
- </p>
- </td>
- </tr>
- <tr>
- <td><p>Number of Un-Serialized Sections</p></td>
- <td>
- <p>This is the number of un-serialized free-space sections being
- managed. Un-serialized sections are created by the free-space
- client when the list of sections is read in.
- </p>
- </td>
+ <tr>
+ <td><p>Number of Serialized Sections</p></td>
+ <td>
+ <p>This is the number of serialized free-space sections being
+ tracked.</p>
+ </td>
+ </tr>
+ <tr>
+ <td><p>Number of Un-Serialized Sections</p></td>
+ <td>
+ <p>This is the number of un-serialized free-space sections being
+ managed. Un-serialized sections are created by the free-space
+ client when the list of sections is read in.</p>
+ </td>
</tr>
<tr>
- <td><p>Number of Section Classes</p></td>
- <td>
- <p>This is the number of section classes handled by this free space
- manager for the free-space client.
- </p>
- </td>
+ <td><p>Number of Section Classes</p></td>
+ <td>
+ <p>This is the number of section classes handled by this free
+ space manager for the free-space client.</p>
+ </td>
</tr>
<tr>
- <td><p>Shrink Percent</p></td>
- <td>
- <p>This is the percent of current size to shrink the allocated
- serialized free-space section list.
- </p>
- </td>
+ <td><p>Shrink Percent</p></td>
+ <td>
+ <p>This is the percent of current size to shrink the allocated
+ serialized free-space section list.</p>
+ </td>
</tr>
<tr>
- <td><p>Expand Percent</p></td>
- <td>
- <p>This is the percent of current size to expand the allocated
- serialized free-space section list.
- </p>
- </td>
+ <td><p>Expand Percent</p></td>
+ <td>
+ <p>This is the percent of current size to expand the allocated
+ serialized free-space section list.</p>
+ </td>
</tr>
<tr>
- <td><p>Size of Address Space</p></td>
- <td>
- <p>This is the size of the address space that free-space sections
- are within. This is stored as the log<sub>2</sub> of the
- actual value (in other words, the number of bits required
- to store values within that address space).
- </p>
- </td>
+ <td><p>Size of Address Space</p></td>
+ <td>
+ <p>
+ This is the size of the address space that free-space sections are
+ within. This is stored as the log<sub>2</sub> of the actual value
+ (in other words, the number of bits required to store values within
+ that address space).
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Maximum Section Size</p></td>
- <td>
- <p>This is the maximum size of a section to be tracked.
- </p>
- </td>
+ <td><p>Maximum Section Size</p></td>
+ <td>
+ <p>This is the maximum size of a section to be tracked.</p>
+ </td>
</tr>
<tr>
- <td><p>Address of Serialized Section List</p></td>
- <td>
- <p>This is the address where the serialized free-space section
- list is stored.
- </p>
- </td>
+ <td><p>Address of Serialized Section List</p></td>
+ <td>
+ <p>This is the address where the serialized free-space section
+ list is stored.</p>
+ </td>
</tr>
<tr>
- <td><p>Size of Serialized Section List Used</p></td>
- <td>
- <p>This is the size of the serialized free-space section
- list used (in bytes). This value must be less than
- or equal to the <em>allocated size of serialized section
- list</em>, below.
- </p>
- </td>
+ <td><p>Size of Serialized Section List Used</p></td>
+ <td>
+ <p>
+ This is the size of the serialized free-space section list used (in
+ bytes). This value must be less than or equal to the <em>allocated
+ size of serialized section list</em>, below.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Allocated Size of Serialized Section List</p></td>
- <td>
- <p>This is the size of serialized free-space section list
- actually allocated (in bytes).
- </p>
- </td>
+ <td><p>Allocated Size of Serialized Section List</p></td>
+ <td>
+ <p>This is the size of serialized free-space section list
+ actually allocated (in bytes).</p>
+ </td>
</tr>
<tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the free-space manager header.</p>
- </td>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the free-space manager header.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>The free-space sections being managed are stored in a
- <em>free-space section list</em>, described below. The sections
- in the free-space section list are stored in the following way:
- a count of the number of sections describing a particular size of
- free space and the size of the free-space described (in bytes),
- followed by a list of section description records; then another
- section count and size, followed by the list of section
- descriptions for that size; and so on.</p>
-
-
- <div align="center">
- <table class="format">
- <caption>
- Free-space Section List
- </caption>
+<br />
+<p>
+ The free-space sections being managed are stored in a <em>free-space
+ section list</em>, described below. The sections in the free-space section
+ list are stored in the following way: a count of the number of sections
+ describing a particular size of free space and the size of the
+ free-space described (in bytes), followed by a list of section
+ description records; then another section count and size, followed by
+ the list of section descriptions for that size; and so on.
+</p>
+
+
+<div align="center">
+ <table class="format">
+ <caption>Free-space Section List</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td>Version</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4"><br />Free-space Manager Header Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Free-space Manager Header Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4">Number of Section Records in Set #0 <em>(variable size)</em></td>
+ <td colspan="4">Number of Section Records in Set #0 <em>(variable
+ size)</em></td>
</tr>
<tr>
- <td colspan="4">Size of Free-space Section Described in Record Set #0 <em>(variable size)</em></td>
- </tr>
+ <td colspan="4">Size of Free-space Section Described in Record
+ Set #0 <em>(variable size)</em>
+ </td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #0 Section Record #0 Offset<em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #0 Section Record #0 Offset<em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="1">Record Set #0 Section Record #0 Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="1">Record Set #0 Section Record #0 Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #0 Section Record #0 Data <em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #0 Section Record #0 Data <em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="4">...</td>
- </tr>
+ <tr>
+ <td colspan="4">...</td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #0 Section Record #K-1 Offset<em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #0 Section Record #K-1 Offset<em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="1">Record Set #0 Section Record #K-1 Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="1">Record Set #0 Section Record #K-1 Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #0 Section Record #K-1 Data <em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #0 Section Record #K-1 Data <em>(variable
+ size)</em></td>
+ </tr>
<tr>
- <td colspan="4">Number of Section Records in Set #1 <em>(variable size)</em></td>
+ <td colspan="4">Number of Section Records in Set #1 <em>(variable
+ size)</em></td>
</tr>
<tr>
- <td colspan="4">Size of Free-space Section Described in Record Set #1 <em>(variable size)</em></td>
- </tr>
+ <td colspan="4">Size of Free-space Section Described in Record
+ Set #1 <em>(variable size)</em>
+ </td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #1 Section Record #0 Offset<em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #1 Section Record #0 Offset<em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="1">Record Set #1 Section Record #0 Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="1">Record Set #1 Section Record #0 Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #1 Section Record #0 Data <em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #1 Section Record #0 Data <em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="4">...</td>
- </tr>
+ <tr>
+ <td colspan="4">...</td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #1 Section Record #K-1 Offset<em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #1 Section Record #K-1 Offset<em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="1">Record Set #1 Section Record #K-1 Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="1">Record Set #1 Section Record #K-1 Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #1 Section Record #K-1 Data <em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #1 Section Record #K-1 Data <em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="4"><strong>...</strong></td>
- </tr>
+ <tr>
+ <td colspan="4"><strong>...</strong></td>
+ </tr>
- <tr>
- <td colspan="4"><strong>...</strong></td>
- </tr>
+ <tr>
+ <td colspan="4"><strong>...</strong></td>
+ </tr>
<tr>
- <td colspan="4">Number of Section Records in Set #N-1 <em>(variable size)</em></td>
+ <td colspan="4">Number of Section Records in Set #N-1 <em>(variable
+ size)</em></td>
</tr>
<tr>
- <td colspan="4">Size of Free-space Section Described in Record Set #N-1 <em>(variable size)</em></td>
- </tr>
+ <td colspan="4">Size of Free-space Section Described in Record
+ Set #N-1 <em>(variable size)</em>
+ </td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #N-1 Section Record #0 Offset<em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #N-1 Section Record #0 Offset<em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="1">Record Set #N-1 Section Record #0 Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="1">Record Set #N-1 Section Record #0 Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #N-1 Section Record #0 Data <em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #N-1 Section Record #0 Data <em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="4">...</td>
- </tr>
+ <tr>
+ <td colspan="4">...</td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #N-1 Section Record #K-1 Offset<em>(variable size)</em></td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #N-1 Section Record #K-1 Offset<em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="1">Record Set #N-1 Section Record #K-1 Type</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="1">Record Set #N-1 Section Record #K-1 Type</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4">Record Set #N-1 Section Record #K-1 Data <em>(variable size)</td>
- </tr>
+ <tr>
+ <td colspan="4">Record Set #N-1 Section Record #K-1 Data <em>(variable
+ size)</em></td>
+ </tr>
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
- </div>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="35%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="35%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>FSSE</code>&rdquo; is used to
- indicate the beginning of the Free-space Section Information.
- This gives file consistency checking utilities a better chance of
- reconstructing a damaged file.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>FSSE</code>
+ &rdquo; is used to indicate the beginning of the Free-space Section
+ Information. This gives file consistency checking utilities a
+ better chance of reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version</p></td>
- <td>
- <p>This is the version number for the Free-space Section List
- and this document describes version 0.</p>
- </td>
+ <td><p>Version</p></td>
+ <td>
+ <p>This is the version number for the Free-space Section List
+ and this document describes version 0.</p>
+ </td>
</tr>
<tr>
- <td><p>Free-space Manager Header Address</p></td>
- <td>
- <p>This is the address of the <em>Free-space Manager Header</em>.
- This field is principally used for file
- integrity checking.
- </p>
- </td>
+ <td><p>Free-space Manager Header Address</p></td>
+ <td>
+ <p>
+ This is the address of the <em>Free-space Manager Header</em>. This
+ field is principally used for file integrity checking.
+ </p>
+ </td>
</tr>
- <tr>
- <td><p>Number of Section Records for Set #N</p></td>
- <td>
- <p>This is the number of free-space section records for set #N.
- The length of this field is the minimum number of bytes needed
- to store the <em>number of serialized sections</em> (from the
- <em>free-space manager header</em>).
- </p>
+ <tr>
+ <td><p>Number of Section Records for Set #N</p></td>
+ <td>
+ <p>
+ This is the number of free-space section records for set #N. The
+ length of this field is the minimum number of bytes needed to store
+ the <em>number of serialized sections</em> (from the <em>free-space
+ manager header</em>).
+ </p>
- <p>
- The number of sets of free-space section records is
- determined by the <em>size of serialized section list</em> in
- the <em>free-space manager header</em>.
- </p>
- </td>
- </tr>
+ <p>
+ The number of sets of free-space section records is determined by
+ the <em>size of serialized section list</em> in the <em>free-space
+ manager header</em>.
+ </p>
+ </td>
+ </tr>
<tr>
- <td><p>Section Size for Record Set #N</p></td>
- <td>
- <p>This is the size (in bytes) of the free-space section described
- for <em>all</em> the section records in set #N.
- </p>
+ <td><p>Section Size for Record Set #N</p></td>
+ <td>
+ <p>
+ This is the size (in bytes) of the free-space section described for
+ <em>all</em> the section records in set #N.
+ </p>
- <p>
- The length of this field is the minimum number of bytes needed
- to store the <em>maximum section size</em> (from the
- <em>free-space manager header</em>).
- </p>
- </td>
+ <p>
+ The length of this field is the minimum number of bytes needed to
+ store the <em>maximum section size</em> (from the <em>free-space
+ manager header</em>).
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Record Set #N Section #K Offset</p></td>
- <td>
- <p>This is the offset (in bytes) of the free-space section within
- the client for the free-space manager.
- </p>
+ <td><p>Record Set #N Section #K Offset</p></td>
+ <td>
+ <p>This is the offset (in bytes) of the free-space section
+ within the client for the free-space manager.</p>
- <p>
- The length of this field is the minimum number of bytes needed
- to store the <em>size of address space</em> (from the
- <em>free-space manager header</em>).
- </p>
- </td>
+ <p>
+ The length of this field is the minimum number of bytes needed to
+ store the <em>size of address space</em> (from the <em>free-space
+ manager header</em>).
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Record Set #N Section #K Type</p></td>
- <td>
- <p>This is the type of the section record, used to decode the
- <em>record set #N section #K data</em> information. The defined
- record type for <em>file</em> client is:
+ <td><p>Record Set #N Section #K Type</p></td>
+ <td>
+ <p>
+ This is the type of the section record, used to decode the <em>record
+ set #N section #K data</em> information. The defined record type for <em>file</em>
+ client is:
+ </p>
<table class="list">
<tr>
- <th width="20%" align="center">Type</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Type</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>File&rsquo;s section (a range of actual bytes in file)
- </td>
+ <td align="center"><code>0</code></td>
+ <td>File&rsquo;s section (a range of actual bytes in file)</td>
</tr>
<tr>
- <td align="center"><code>1+</code></td>
- <td>Reserved.
- </td>
+ <td align="center"><code>1+</code></td>
+ <td>Reserved.</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- <p>The defined record types for a <em>fractal heap</em> client are:
+ <p>
+ The defined record types for a <em>fractal heap</em> client are:
+ </p>
<table class="list">
<tr>
- <th width="20%" align="center">Type</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Type</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>Fractal heap &ldquo;single&rdquo; section
- </td>
+ <td align="center"><code>0</code></td>
+ <td>Fractal heap &ldquo;single&rdquo; section</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>Fractal heap &ldquo;first row&rdquo; section
- </td>
+ <td align="center"><code>1</code></td>
+ <td>Fractal heap &ldquo;first row&rdquo; section</td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>Fractal heap &ldquo;normal row&rdquo; section
- </td>
+ <td align="center"><code>2</code></td>
+ <td>Fractal heap &ldquo;normal row&rdquo; section</td>
</tr>
<tr>
- <td align="center"><code>3</code></td>
- <td>Fractal heap &ldquo;indirect&rdquo; section
- </td>
+ <td align="center"><code>3</code></td>
+ <td>Fractal heap &ldquo;indirect&rdquo; section</td>
</tr>
<tr>
- <td align="center"><code>4+</code></td>
- <td>Reserved.
- </td>
+ <td align="center"><code>4+</code></td>
+ <td>Reserved.</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- </td>
+ </td>
</tr>
<tr>
- <td><p>Record Set #N Section #K Data</p></td>
- <td>
- <p>This is the section-type specific information for each record
- in the record set, described below.
- </p>
- </td>
+ <td><p>Record Set #N Section #K Data</p></td>
+ <td>
+ <p>This is the section-type specific information for each record
+ in the record set, described below.</p>
+ </td>
</tr>
<tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the <em>Free-space Section List</em>.
- </p>
- </td>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>
+ This is the checksum for the <em>Free-space Section List</em>.
+ </p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>
- The section-type specific data for each free-space section record is
- described below:
- </p>
+<br />
+<p>The section-type specific data for each free-space section record
+ is described below:</p>
- <div align="center">
- <table class="format">
- <caption>
- File&rsquo;s Section Data Record
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>File&rsquo;s Section Data Record</caption>
<tr>
- <td colspan="4"><em>No additional record data stored</em></td>
+ <td colspan="4"><em>No additional record data stored</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fractal Heap &ldquo;Single&rdquo; Section Data Record
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap &ldquo;Single&rdquo; Section Data
+ Record</caption>
<tr>
- <td colspan="4"><em>No additional record data stored</em></td>
+ <td colspan="4"><em>No additional record data stored</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fractal Heap &ldquo;First Row&rdquo; Section Data Record
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap &ldquo;First Row&rdquo; Section Data
+ Record</caption>
<tr>
- <td colspan="4"><em>Same format as &ldquo;indirect&rdquo; section data</em></td>
+ <td colspan="4"><em>Same format as &ldquo;indirect&rdquo;
+ section data</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fractal Heap &ldquo;Normal Row&rdquo; Section Data Record
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap &ldquo;Normal Row&rdquo; Section Data
+ Record</caption>
<tr>
- <td colspan="4"><em>No additional record data stored</em></td>
+ <td colspan="4"><em>No additional record data stored</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fractal Heap &ldquo;Indirect&rdquo; Section Data Record
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fractal Heap &ldquo;Indirect&rdquo; Section Data
+ Record</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Fractal Heap Indirect Block Offset <em>(variable size)</em></td>
+ <td colspan="4">Fractal Heap Indirect Block Offset <em>(variable
+ size)</em></td>
</tr>
<tr>
- <td colspan="2">Block Start Row</td>
- <td colspan="2">Block Start Column</td>
+ <td colspan="2">Block Start Row</td>
+ <td colspan="2">Block Start Column</td>
</tr>
<tr>
- <td colspan="2">Number of Blocks</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td colspan="2">Number of Blocks</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Fractal Heap Block Offset</p></td>
- <td>
- <p>The offset of the indirect block in the fractal heap&rsquo;s address
- space containing the empty blocks.
- </p>
- <p>
- The number of bytes used to encode this field is the minimum
- number of bytes needed to encode values for the <em>Maximum
- Heap Size</em> (in the fractal heap&rsquo;s header).
- </p>
- </td>
+ <td><p>Fractal Heap Block Offset</p></td>
+ <td>
+ <p>The offset of the indirect block in the fractal heap&rsquo;s
+ address space containing the empty blocks.</p>
+ <p>
+ The number of bytes used to encode this field is the minimum number
+ of bytes needed to encode values for the <em>Maximum Heap Size</em>
+ (in the fractal heap&rsquo;s header).
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Block Start Row</p></td>
- <td>
- <p>This is the row that the empty blocks start in.
- </p>
- </td>
+ <td><p>Block Start Row</p></td>
+ <td>
+ <p>This is the row that the empty blocks start in.</p>
+ </td>
</tr>
<tr>
- <td><p>Block Start Column</p></td>
- <td>
- <p>This is the column that the empty blocks start in.
- </p>
- </td>
+ <td><p>Block Start Column</p></td>
+ <td>
+ <p>This is the column that the empty blocks start in.</p>
+ </td>
</tr>
<tr>
- <td><p>Number of Blocks</p></td>
- <td>
- <p>This is the number of empty blocks covered by the section.
- </p>
- </td>
+ <td><p>Number of Blocks</p></td>
+ <td>
+ <p>This is the number of empty blocks covered by the section.</p>
+ </td>
</tr>
- </table>
- </div>
-
-<br />
-<h3><a name="SOHMTable">
-III.H. Disk Format: Level 1H - Shared Object Header Message Table</a></h3>
-
- <p>
- The <em>shared object header message table</em> is used to locate
- object
- header messages that are shared between two or more object headers
- in the file. Shared object header messages are stored and indexed
- in the file in one of two ways: indexed sequentially in a
- <em>shared header message list</em> or indexed with a v2 B-tree.
- The shared messages themselves are either stored in a fractal
- heap (when two or more objects share the message), or remain in an
- object&rsquo;s header (when only one object uses the message currently,
- but the message can be shared in the future).
- </p>
-
- <p>
- The <em>shared object header message table</em>
- contains a list of shared message index headers. Each index header
- records information about the version of the index format, the index
- storage type, flags for the message types indexed, the number of
- messages in the index, the address where the index resides,
- and the fractal heap address if shared messages are stored there.
- </p>
-
- <p>
- Each index can be either a list or a v2 B-tree and may transition
- between those two forms as the number of messages in the index
- varies. Each shared message record contains information used to
- locate the shared message from either a fractal heap or an object
- header. The types of messages that can be shared are: <em>Dataspace,
- Datatype, Fill Value, Filter Pipeline and Attribute</em>.
- </p>
-
- <p>
- The <em>shared object header message table</em> is pointed to
- from a <a href="#SOHMTableMessage">shared message table</a> message
- in the superblock extension for a file. This message stores the
- version of the table format, along with the number of index headers
- in the table.
- </p>
-
- <div align="center">
- <table class="format">
- <caption>
- Shared Object Header Message Table
- </caption>
+ </table>
+</div>
+
+<br />
+<h3>
+ <a name="SOHMTable"> III.H. Disk Format: Level 1H - Shared Object
+ Header Message Table</a>
+</h3>
+
+<p>
+ The <em>shared object header message table</em> is used to locate
+ object header messages that are shared between two or more object
+ headers in the file. Shared object header messages are stored and
+ indexed in the file in one of two ways: indexed sequentially in a <em>shared
+ header message list</em> or indexed with a v2 B-tree. The shared messages
+ themselves are either stored in a fractal heap (when two or more
+ objects share the message), or remain in an object&rsquo;s header (when
+ only one object uses the message currently, but the message can be
+ shared in the future).
+</p>
+
+<p>
+ The <em>shared object header message table</em> contains a list of
+ shared message index headers. Each index header records information
+ about the version of the index format, the index storage type, flags
+ for the message types indexed, the number of messages in the index, the
+ address where the index resides, and the fractal heap address if shared
+ messages are stored there.
+</p>
+
+<p>
+ Each index can be either a list or a v2 B-tree and may transition
+ between those two forms as the number of messages in the index varies.
+ Each shared message record contains information used to locate the
+ shared message from either a fractal heap or an object header. The
+ types of messages that can be shared are: <em>Dataspace, Datatype,
+ Fill Value, Filter Pipeline and Attribute</em>.
+</p>
+
+<p>
+ The <em>shared object header message table</em> is pointed to from a <a
+ href="#SOHMTableMessage">shared message table</a> message in the
+ superblock extension for a file. This message stores the version of the
+ table format, along with the number of index headers in the table.
+</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Shared Object Header Message Table</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td>Version for index #0</td>
- <td>Index Type for index #0</td>
- <td colspan="2">Message Type Flags for index #0</td>
+ <td>Version for index #0</td>
+ <td>Index Type for index #0</td>
+ <td colspan="2">Message Type Flags for index #0</td>
</tr>
<tr>
- <td colspan="4">Minimum Message Size for index #0</td>
+ <td colspan="4">Minimum Message Size for index #0</td>
</tr>
<tr>
- <td colspan="2">List Cutoff for index #0</td>
- <td colspan="2">v2 B-tree Cutoff for index #0</td>
+ <td colspan="2">List Cutoff for index #0</td>
+ <td colspan="2">v2 B-tree Cutoff for index #0</td>
</tr>
<tr>
- <td colspan="2">Number of Messages for index #0</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <td colspan="2">Number of Messages for index #0</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4"><br />Index Address<sup>O</sup> for index #0<br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Index Address<sup>O</sup> for index #0<br />
+ <br /></td>
+ </tr>
- <tr>
- <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for index #0<br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for
+ index #0<br />
+ <br /></td>
+ </tr>
<tr>
- <td colspan="4">...</td>
- </tr>
+ <td colspan="4">...</td>
+ </tr>
<tr>
- <td colspan="4">...</td>
- </tr>
+ <td colspan="4">...</td>
+ </tr>
<tr>
- <td>Version for index #N-1</td>
- <td>Index Type for index #N-1</td>
- <td colspan="2">Message Type Flags for index #N-1</td>
+ <td>Version for index #N-1</td>
+ <td>Index Type for index #N-1</td>
+ <td colspan="2">Message Type Flags for index #N-1</td>
</tr>
<tr>
- <td colspan="4">Minimum Message Size for index #N-1</td>
+ <td colspan="4">Minimum Message Size for index #N-1</td>
</tr>
<tr>
- <td colspan="2">List Cutoff for index #N-1</td>
- <td colspan="2">v2 B-tree Cutoff for index #N-1</td>
+ <td colspan="2">List Cutoff for index #N-1</td>
+ <td colspan="2">v2 B-tree Cutoff for index #N-1</td>
</tr>
<tr>
- <td colspan="2">Number of Messages for index #N-1</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <td colspan="2">Number of Messages for index #N-1</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <tr>
- <td colspan="4"><br />Index Address<sup>O</sup> for index #N-1<br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Index Address<sup>O</sup> for index #N-1<br />
+ <br /></td>
+ </tr>
- <tr>
- <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for index #N-1<br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for
+ index #N-1<br />
+ <br /></td>
+ </tr>
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="35%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="35%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>SMTB</code>&rdquo; is used to
- indicate the beginning of the Shared Object Header Message table.
- This gives file consistency checking utilities a better chance of
- reconstructing a damaged file.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>SMTB</code>
+ &rdquo; is used to indicate the beginning of the Shared Object
+ Header Message table. This gives file consistency checking
+ utilities a better chance of reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Version for index #N</p></td>
- <td>
- <p>This is the version number for the list of shared object header message
- indexes and this document describes version 0.</p>
- </td>
+ <td><p>Version for index #N</p></td>
+ <td>
+ <p>This is the version number for the list of shared object
+ header message indexes and this document describes version 0.</p>
+ </td>
</tr>
<tr>
- <td><p>Index Type for index #N</p></td>
- <td>
- <p>The type of index can be an unsorted list or a v2 B-tree.
- </p>
- </td>
+ <td><p>Index Type for index #N</p></td>
+ <td>
+ <p>The type of index can be an unsorted list or a v2 B-tree.</p>
+ </td>
</tr>
- <tr>
- <td><p>Message Type Flags for index #N</p></td>
- <td>
- <p>This field indicates the type of messages tracked in the index,
- as follows:
+ <tr>
+ <td><p>Message Type Flags for index #N</p></td>
+ <td>
+ <p>This field indicates the type of messages tracked in the
+ index, as follows:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Bits</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Bits</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>If set, the index tracks <em>Dataspace Messages</em>.
- </td>
+ <td align="center"><code>0</code></td>
+ <td>If set, the index tracks <em>Dataspace Messages</em>.
+ </td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>If set, the message tracks <em>Datatype Messages</em>.
- </td>
+ <td align="center"><code>1</code></td>
+ <td>If set, the message tracks <em>Datatype Messages</em>.
+ </td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>If set, the message tracks <em>Fill Value Messages</em>.
- </td>
+ <td align="center"><code>2</code></td>
+ <td>If set, the message tracks <em>Fill Value Messages</em>.
+ </td>
</tr>
<tr>
- <td align="center"><code>3</code></td>
- <td>If set, the message tracks <em>Filter Pipeline Messages</em>.
- </td>
+ <td align="center"><code>3</code></td>
+ <td>If set, the message tracks <em>Filter Pipeline
+ Messages</em>.
+ </td>
</tr>
<tr>
- <td align="center"><code>4</code></td>
- <td>If set, the message tracks <em>Attribute Messages</em>.
- </td>
+ <td align="center"><code>4</code></td>
+ <td>If set, the message tracks <em>Attribute Messages</em>.
+ </td>
</tr>
<tr>
- <td align="center"><code>5-15</code></td>
- <td>Reserved (zero).
- </td>
+ <td align="center"><code>5-15</code></td>
+ <td>Reserved (zero).</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- <p>
- An index can track more than one type of message, but each type
- of message can only by in one index.
- </p>
- </td>
- </tr>
+ <p>An index can track more than one type of message, but each
+ type of message can only by in one index.</p>
+ </td>
+ </tr>
<tr>
- <td><p>Minimum Message Size for index #N</p></td>
- <td>
- <p>This is the message size sharing threshold for the index.
- If the encoded size of the message is less than this value, the
- message is not shared.
- </p>
- </td>
+ <td><p>Minimum Message Size for index #N</p></td>
+ <td>
+ <p>This is the message size sharing threshold for the index. If
+ the encoded size of the message is less than this value, the
+ message is not shared.</p>
+ </td>
</tr>
- <tr>
- <td><p>List Cutoff for index #N</p></td>
- <td>
- <p>This is the cutoff value for the indexing of messages to
- switch from a list to a v2 B-tree. If the number of messages
- is greater than this value, the index should be a v2 B-tree.
- </p>
- </td>
- </tr>
- <tr>
- <td><p>v2 B-tree Cutoff for index #N</p></td>
- <td>
- <p>This is the cutoff value for the indexing of messages to
- switch from a v2 B-tree back to a list. If the number of
- messages is less than this value, the index should be a list.
- </p>
- </td>
+ <tr>
+ <td><p>List Cutoff for index #N</p></td>
+ <td>
+ <p>This is the cutoff value for the indexing of messages to
+ switch from a list to a v2 B-tree. If the number of messages is
+ greater than this value, the index should be a v2 B-tree.</p>
+ </td>
+ </tr>
+ <tr>
+ <td><p>v2 B-tree Cutoff for index #N</p></td>
+ <td>
+ <p>This is the cutoff value for the indexing of messages to
+ switch from a v2 B-tree back to a list. If the number of messages
+ is less than this value, the index should be a list.</p>
+ </td>
</tr>
<tr>
- <td><p>Number of Messages for index #N</p></td>
- <td>
- <p>The number of shared messages being tracked for the index.
- </p>
- </td>
+ <td><p>Number of Messages for index #N</p></td>
+ <td>
+ <p>The number of shared messages being tracked for the index.</p>
+ </td>
</tr>
<tr>
- <td><p>Index Address for index #N</p></td>
- <td>
- <p>This field is the address of the list or v2 B-tree where the
- index nodes reside.
- </p>
- </td>
+ <td><p>Index Address for index #N</p></td>
+ <td>
+ <p>This field is the address of the list or v2 B-tree where the
+ index nodes reside.</p>
+ </td>
</tr>
<tr>
- <td><p>Fractal Heap Address for index #N</p></td>
- <td>
- <p>This field is the address of the fractal heap if shared messages
- are stored there.
- </p>
- </td>
+ <td><p>Fractal Heap Address for index #N</p></td>
+ <td>
+ <p>This field is the address of the fractal heap if shared
+ messages are stored there.</p>
+ </td>
</tr>
<tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the table.</p>
- </td>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the table.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>
- Shared messages are indexed either with a <em>shared message record
- list</em>, described below, or using a v2 B-tree (using record type 7).
- The number of records in the <em>shared message record list</em> is
- determined in the index&rsquo;s entry in the <em>shared object header message
- table</em>.
- </p>
-
- <div align="center">
- <table class="format">
- <caption>
- Shared Message Record List
- </caption>
+<br />
+<p>
+ Shared messages are indexed either with a <em>shared message
+ record list</em>, described below, or using a v2 B-tree (using record type
+ 7). The number of records in the <em>shared message record list</em> is
+ determined in the index&rsquo;s entry in the <em>shared object
+ header message table</em>.
+</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Shared Message Record List</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td colspan="4">Signature</td>
+ <td colspan="4">Signature</td>
</tr>
<tr>
- <td colspan="4">Shared Message Record #0</td>
+ <td colspan="4">Shared Message Record #0</td>
</tr>
<tr>
- <td colspan="4">Shared Message Record #1</td>
+ <td colspan="4">Shared Message Record #1</td>
</tr>
<tr>
- <td colspan="4">...</td>
+ <td colspan="4">...</td>
</tr>
<tr>
- <td colspan="4">Shared Message Record #N-1</td>
+ <td colspan="4">Shared Message Record #N-1</td>
</tr>
<tr>
- <td colspan="4">Checksum</td>
+ <td colspan="4">Checksum</td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>SMLI</code>&rdquo; is used to
- indicate the beginning of a list of index nodes.
- This gives file consistency checking utilities a better chance of
- reconstructing a damaged file.
- </p>
- </td>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>SMLI</code>
+ &rdquo; is used to indicate the beginning of a list of index nodes.
+ This gives file consistency checking utilities a better chance of
+ reconstructing a damaged file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Shared Message Record #N</p></td>
- <td>
- <p>The record for locating the shared message, either in the
- fractal heap for the index, or an object header (see format for
- <em>index nodes</em> below).
- </p>
- </td>
+ <td><p>Shared Message Record #N</p></td>
+ <td>
+ <p>
+ The record for locating the shared message, either in the fractal
+ heap for the index, or an object header (see format for <em>index
+ nodes</em> below).
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the list.
- </p>
- </td>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the list.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>
- The record for each shared message in an index is stored in one of the
- following forms:
- </p>
+<br />
+<p>The record for each shared message in an index is stored in one
+ of the following forms:</p>
- <div align="center">
- <table class="format">
- <caption>
- Shared Message Record, for messages stored in a fractal heap
- </caption>
+<div align="center">
+ <table class="format">
+ <caption>Shared Message Record, for messages stored in a
+ fractal heap</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td>Message Location</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td>Message Location</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4">Hash Value</td>
+ <td colspan="4">Hash Value</td>
</tr>
<tr>
- <td colspan="4">Reference Count</td>
+ <td colspan="4">Reference Count</td>
</tr>
<tr>
- <td colspan="4"><br />Fractal Heap ID<br /><br /></td>
+ <td colspan="4"><br />Fractal Heap ID<br />
+ <br /></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Message Location</p></td>
- <td>
- <p>This has a value of 0 indicating that the message is stored in
- the heap.
- </p>
- </td>
+ <td><p>Message Location</p></td>
+ <td>
+ <p>This has a value of 0 indicating that the message is stored
+ in the heap.</p>
+ </td>
</tr>
<tr>
- <td><p>Hash Value</p></td>
- <td>
- <p>This is the hash value for the message.
- </p>
- </td>
+ <td><p>Hash Value</p></td>
+ <td>
+ <p>This is the hash value for the message.</p>
+ </td>
</tr>
<tr>
- <td><p>Reference Count</p></td>
- <td>
- <p>This is the number of times the message is used in the file.
- </p>
- </td>
+ <td><p>Reference Count</p></td>
+ <td>
+ <p>This is the number of times the message is used in the file.
+ </p>
+ </td>
</tr>
<tr>
- <td><p>Fractal Heap ID</p></td>
- <td>
- <p>This is an 8-byte fractal heap ID for the message as stored in
- the fractal heap for the index.
- </p>
- </td>
+ <td><p>Fractal Heap ID</p></td>
+ <td>
+ <p>This is an 8-byte fractal heap ID for the message as stored
+ in the fractal heap for the index.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Shared Message Record, for messages stored in an object header
- </caption>
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Shared Message Record, for messages stored in an
+ object header</caption>
<tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
<tr>
- <td>Message Location</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+ <td>Message Location</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
</tr>
<tr>
- <td colspan="4">Hash Value</td>
+ <td colspan="4">Hash Value</td>
</tr>
<tr>
- <td>Reserved</td>
- <td>Message Type</td>
- <td colspan="2">Creation Index</td>
+ <td>Reserved</td>
+ <td>Message Type</td>
+ <td colspan="2">Creation Index</td>
</tr>
<tr>
- <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Object Header Address<sup>O</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Message Location</p></td>
- <td>
- <p>This has a value of 1 indicating that the message is stored in
- an object header.
- </p>
- </td>
+ <td><p>Message Location</p></td>
+ <td>
+ <p>This has a value of 1 indicating that the message is stored
+ in an object header.</p>
+ </td>
</tr>
<tr>
- <td><p>Hash Value</p></td>
- <td>
- <p>This is the hash value for the message.
- </p>
- </td>
+ <td><p>Hash Value</p></td>
+ <td>
+ <p>This is the hash value for the message.</p>
+ </td>
</tr>
<tr>
- <td><p>Message Type</p></td>
- <td>
- <p>This is the message type in the object header.
- </p>
- </td>
+ <td><p>Message Type</p></td>
+ <td>
+ <p>This is the message type in the object header.</p>
+ </td>
</tr>
<tr>
- <td><p>Creation Index</p></td>
- <td>
- <p>This is the creation index of the message within the object
- header.
- </p>
- </td>
+ <td><p>Creation Index</p></td>
+ <td>
+ <p>This is the creation index of the message within the object
+ header.</p>
+ </td>
</tr>
<tr>
- <td><p>Object Header Address</p></td>
- <td>
- <p>This is the address of the object header where the message is
- located.
- </p>
- </td>
+ <td><p>Object Header Address</p></td>
+ <td>
+ <p>This is the address of the object header where the message is
+ located.</p>
+ </td>
</tr>
- </table>
- </div>
+ </table>
+</div>
<br />
<br />
<hr />
-<h2><a name="DataObject">
-IV. Disk Format: Level 2 - Data Objects </a></h2>
-
- <p>Data objects contain the &ldquo;real&rdquo; user-visible information in the file.
- These objects compose the scientific data and other information which
- are generally thought of as &ldquo;data&rdquo; by the end-user. All the
- other information in the file is provided as a framework for
- storing and accessing these data objects.
- </p>
-
- <p>A data object is composed of header and data
- information. The header information contains the information
- needed to interpret the data information for the object as
- well as additional &ldquo;metadata&rdquo; or pointers to additional
- &ldquo;metadata&rdquo; used to describe or annotate each object.
- </p>
-
-<br />
-<h3><a name="ObjectHeader">
-IV.A. Disk Format: Level 2A - Data Object Headers</a></h3>
-
- <p>The header information of an object is designed to encompass
- all of the information about an object, except for the data itself.
- This information includes the dataspace, the datatype, information
- about how the data is stored on disk (in external files, compressed,
- broken up in blocks, and so on), as well as other information used
- by the library to speed up access to the data objects or maintain
- a file&rsquo;s integrity. Information stored by user applications
- as attributes is also stored in the object&rsquo;s header. The header
- of each object is not necessarily located immediately prior to the
- object&rsquo;s data in the file and in fact may be located in any
- position in the file. The order of the messages in an object header
- is not significant.</p>
-
- <p>Object headers are composed of a prefix and a set of messages. The
- prefix contains the information needed to interpret the messages and
- a small amount of metadata about the object, and the messages contain
- the majority of the metadata about the object.
- </p>
-
-<br />
-<h3><a name="ObjectHeaderPrefix">
-IV.A.1. Disk Format: Level 2A1 - Data Object Header Prefix</a></h3>
-
-<br />
-<h4><a name="V1ObjectHeaderPrefix">
-IV.A.1.a. Version 1 Data Object Header Prefix</a></h4>
-
- <p>Header messages are aligned on 8-byte boundaries for version 1
- object headers.
- </p>
-
- <div align="center">
- <table class="format">
- <caption>
- Version 1 Object Header
- </caption>
-
- <tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Reserved (zero)</td>
- <td colspan="2">Total Number of Header Messages</td>
- </tr>
-
- <tr>
- <td colspan="4">Object Reference Count</td>
- </tr>
-
- <tr>
- <td colspan="4">Object Header Size</td>
- </tr>
-
- <tr>
- <td colspan="2">Header Message Type #1</td>
- <td colspan="2">Size of Header Message Data #1</td>
- </tr>
-
- <tr>
- <td>Header Message #1 Flags</td>
- <td colspan="3">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Header Message Data #1<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
-
- <tr>
- <td colspan="2">Header Message Type #n</td>
- <td colspan="2">Size of Header Message Data #n</td>
- </tr>
-
- <tr>
- <td>Header Message #n Flags</td>
- <td colspan="3">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Header Message Data #n<br /><br /></td>
- </tr>
- </table>
- </div>
+<h2>
+ <a name="DataObject"> IV. Disk Format: Level 2 - Data Objects </a>
+</h2>
+
+<p>Data objects contain the &ldquo;real&rdquo; user-visible
+ information in the file. These objects compose the scientific data and
+ other information which are generally thought of as &ldquo;data&rdquo;
+ by the end-user. All the other information in the file is provided as a
+ framework for storing and accessing these data objects.</p>
+
+<p>A data object is composed of header and data information. The
+ header information contains the information needed to interpret the
+ data information for the object as well as additional
+ &ldquo;metadata&rdquo; or pointers to additional &ldquo;metadata&rdquo;
+ used to describe or annotate each object.</p>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>This value is used to determine the format of the
- information in the object header. When the format of the
- object header is changed, the version number
- is incremented and can be used to determine how the
- information in the object header is formatted. This
- is version one (1) (there was no version zero (0)) of the
- object header.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Total Number of Header Messages</p></td>
- <td>
- <p>This value determines the total number of messages listed in
- object headers for this object. This value includes the messages
- in continuation messages for this object.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Object Reference Count</p></td>
- <td>
- <p>This value specifies the number of &ldquo;hard links&rdquo; to this object
- within the current file. References to the object from external
- files, &ldquo;soft links&rdquo; in this file and object references in this
- file are not tracked.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Object Header Size</p></td>
- <td>
- <p>This value specifies the number of bytes of header message data
- following this length field that contain object header messages
- for this object header. This value does not include the size of
- object header continuation blocks for this object elsewhere in the
- file.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Type</p></td>
- <td>
- <p>This value specifies the type of information included in the
- following header message data. The message types for
- header messages are defined in sections below.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Header Message #n Data</p></td>
- <td>
- <p>This value specifies the number of bytes of header
- message data following the header message type and length
- information for the current message. The size includes
- padding bytes to make the message a multiple of eight
- bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Flags</p></td>
- <td>
- <p>This is a bit field with the following definition:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set, the message data is constant. This is used
- for messages like the datatype message of a dataset.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>If set, the message is <em>shared</em> and stored
- in another location than the object header. The Header
- Message Data field contains a Shared Message
- (described in the <a href="#ObjectHeaderMessages">Data Object Header Messages</a>
- section below)
- and the Size of Header Message Data field
- contains the size of that Shared Message.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2</code></td>
- <td>If set, the message should not be shared.
- </td>
- </tr>
- <tr>
- <td align="center"><code>3</code></td>
- <td>If set, the HDF5 decoder should fail to open this object
- if it does not understand the message&rsquo;s type and the file
- is open with permissions allowing write access to the file.
- (Normally, unknown messages can just be ignored by HDF5
- decoders)
- </td>
- </tr>
- <tr>
- <td align="center"><code>4</code></td>
- <td>If set, the HDF5 decoder should set bit 5 of this
- message&rsquo;s flags (in other words, this bit field)
- if it does not understand the message&rsquo;s type
- and the object is modified in any way. (Normally,
- unknown messages can just be ignored by HDF5
- decoders)
- </td>
- </tr>
- <tr>
- <td align="center"><code>5</code></td>
- <td>If set, this object was modified by software that did not
- understand this message.
- (Normally, unknown messages should just be ignored by HDF5
- decoders) (Can be used to invalidate an index or a similar
- feature)
- </td>
- </tr>
- <tr>
- <td align="center"><code>6</code></td>
- <td>If set, this message is shareable.
- </td>
- </tr>
- <tr>
- <td align="center"><code>7</code></td>
- <td>If set, the HDF5 decoder should always fail to open this
- object if it does not understand the message&rsquo;s type (whether
- it is open for read-only or read-write access). (Normally,
- unknown messages can just be ignored by HDF5 decoders)
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Data</p></td>
- <td>
- <p>The format and length of this field is determined by the
- header message type and size respectively. Some header
- message types do not require any data and this information
- can be eliminated by setting the length of the message to
- zero. The data is padded with enough zeroes to make the
- size a multiple of eight.
- </p>
- </td>
- </tr>
- </table>
- </div>
-
-<br />
-<h4><a name="V2ObjectHeaderPrefix">
-IV.A.1.b. Version 2 Data Object Header Prefix</a></h4>
-
- <p>Note that the &ldquo;total number of messages&rdquo; field has been dropped from
- the data object header prefix in this version. The number of messages
- in the data object header is just determined by the messages encountered
- in all the object header blocks.</p>
-
- <p>Note also that the fields and messages in this version of data object
- headers have <em>no</em> alignment or padding bytes inserted - they are
- stored packed together.</p>
-
- <div align="center">
- <table class="format">
- <caption>
- Version 2 Object Header
- </caption>
-
- <tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
-
- <tr>
- <td colspan="4">Signature</td>
- </tr>
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Access time <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Modification Time <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Change Time <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Birth Time <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="2">Maximum # of compact attributes <em>(optional)</em></td>
- <td colspan="2">Minimum # of dense attributes <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td>Size of Chunk #0 <em>(variable size)</em></td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td>Header Message Type #1</td>
- <td colspan="2">Size of Header Message Data #1</td>
- <td>Header Message #1 Flags</td>
- </tr>
-
- <tr>
- <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Header Message Data #1<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
-
- <tr>
- <td>Header Message Type #n</td>
- <td colspan="2">Size of Header Message Data #n</td>
- <td>Header Message #n Flags</td>
- </tr>
-
- <tr>
- <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Header Message Data #n<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Gap <em>(optional, variable size)</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
- </div>
+<br />
+<h3>
+ <a name="ObjectHeader"> IV.A. Disk Format: Level 2A - Data Object
+ Headers</a>
+</h3>
+
+<p>The header information of an object is designed to encompass all
+ of the information about an object, except for the data itself. This
+ information includes the dataspace, the datatype, information about how
+ the data is stored on disk (in external files, compressed, broken up in
+ blocks, and so on), as well as other information used by the library to
+ speed up access to the data objects or maintain a file&rsquo;s
+ integrity. Information stored by user applications as attributes is
+ also stored in the object&rsquo;s header. The header of each object is
+ not necessarily located immediately prior to the object&rsquo;s data in
+ the file and in fact may be located in any position in the file. The
+ order of the messages in an object header is not significant.</p>
+
+<p>Object headers are composed of a prefix and a set of messages.
+ The prefix contains the information needed to interpret the messages
+ and a small amount of metadata about the object, and the messages
+ contain the majority of the metadata about the object.</p>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>OHDR</code>&rdquo;
- is used to indicate the
- beginning of an object header. This gives file consistency
- checking utilities a better chance of reconstructing a
- damaged file.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>This field has a value of 2 indicating version 2 of the object header.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td>
- <p>This field is a bit field indicating additional information
- about the object header.
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit(s)</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0-1</code></td>
- <td>This two bit field determines the size of the
- <em>Size of Chunk #0</em> field. The values are:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
+<br />
+<h3>
+ <a name="ObjectHeaderPrefix"> IV.A.1. Disk Format: Level 2A1 - Data
+ Object Header Prefix</a>
+</h3>
- <tr>
- <td align="center"><code>0</code></td>
- <td>The <em>Size of Chunk #0</em> field is 1 byte.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>The <em>Size of Chunk #0</em> field is 2 bytes.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2</code></td>
- <td>The <em>Size of Chunk #0</em> field is 4 bytes.
- </td>
- </tr>
- <tr>
- <td align="center"><code>3</code></td>
- <td>The <em>Size of Chunk #0</em> field is 8 bytes.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
- <tr>
- <td align="center"><code>2</code></td>
- <td>If set, attribute creation order is tracked.</td>
- </tr>
- <tr>
- <td align="center"><code>3</code></td>
- <td>If set, attribute creation order is indexed.</td>
- </tr>
- <tr>
- <td align="center"><code>4</code></td>
- <td>If set, non-default attribute storage phase change
- values are stored.</td>
- </tr>
- <tr>
- <td align="center"><code>5</code></td>
- <td>If set, access, modification, change and birth times
- are stored.</td>
- </tr>
- <tr>
- <td align="center"><code>6-7</code></td>
- <td>Reserved</td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Access Time</p></td>
- <td>
- <p>This 32-bit value represents the number of seconds after the
- UNIX epoch when the object&rsquo;s raw data was last accessed
- (in other words, read or written).
- </p>
- <p>This field is present if bit 5 of <em>flags</em> is set.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Modification Time</p></td>
- <td>
- <p>This 32-bit value represents the number of seconds after
- the UNIX epoch when the object&rsquo;s raw data was last
- modified (in other words, written).
- </p>
- <p>This field is present if bit 5 of <em>flags</em> is set.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Change Time</p></td>
- <td>
- <p>This 32-bit value represents the number of seconds after the
- UNIX epoch when the object&rsquo;s metadata was last changed.
- </p>
- <p>This field is present if bit 5 of <em>flags</em> is set.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Birth Time</p></td>
- <td>
- <p>This 32-bit value represents the number of seconds after the
- UNIX epoch when the object was created.
- </p>
- <p>This field is present if bit 5 of <em>flags</em> is set.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Maximum # of compact attributes</p></td>
- <td>
- <p>This is the maximum number of attributes to store in the compact
- format before switching to the indexed format.
- </p>
- <p>This field is present if bit 4 of <em>flags</em> is set.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Minimum # of dense attributes</p></td>
- <td>
- <p>This is the minimum number of attributes to store in the indexed
- format before switching to the compact format.
- </p>
- <p>This field is present if bit 4 of <em>flags</em> is set.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Chunk #0</p></td>
- <td>
- <p>
- This unsigned value specifies the number of bytes of header
- message data following this field that contain object header
- information.
- </p>
- <p>
- This value does not include the size of object header
- continuation blocks for this object elsewhere in the file.
- </p>
- <p>
- The length of this field varies depending on bits 0 and 1 of
- the <em>flags</em> field.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Type</p></td>
- <td>
- <p>Same format as version 1 of the object header, described above.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size of Header Message #n Data</p></td>
- <td>
- <p>This value specifies the number of bytes of header
- message data following the header message type and length
- information for the current message. The size of messages
- in this version does <em>not</em> include any padding bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Flags</p></td>
- <td>
- <p>Same format as version 1 of the object header, described above.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Creation Order</p></td>
- <td>
- <p>This field stores the order that a message of a given type
- was created in.
- </p>
- <p>This field is present if bit 2 of <em>flags</em> is set.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Data</p></td>
- <td>
- <p>Same format as version 1 of the object header, described above.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Gap</p></td>
- <td>
- <p>A gap in an object header chunk is inferred by the end of the
- messages for the chunk before the beginning of the chunk&rsquo;s
- checksum. Gaps are always smaller than the size of an
- object header message prefix (message type + message size +
- message flags).
- </p>
- <p>Gaps are formed when a message (typically an attribute message)
- in an earlier chunk is deleted and a message from a later
- chunk that does not quite fit into the free space is moved
- into the earlier chunk.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the object header chunk.
- </p>
- </td>
+<br />
+<h4>
+ <a name="V1ObjectHeaderPrefix"> IV.A.1.a. Version 1 Data Object
+ Header Prefix</a>
+</h4>
+
+<p>Header messages are aligned on 8-byte boundaries for version 1
+ object headers.</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Version 1 Object Header</caption>
+
+ <tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
</tr>
- </table>
- </div>
-
- <p>The header message types and the message data associated with
- them compose the critical &ldquo;metadata&rdquo; about each object. Some
- header messages are required for each object while others are
- optional. Some optional header messages may also be repeated
- several times in the header itself, the requirements and number
- of times allowed in the header will be noted in each header
- message description below.
- </p>
-
-
-<br />
-<h3><a name="ObjectHeaderMessages">
-IV.A.2. Disk Format: Level 2A2 - Data Object Header Messages</a></h3>
-
- <p>Data object header messages are small pieces of metadata that are
- stored in the data object header for each object in an HDF5 file.
- Data object header messages provide the metadata required to describe
- an object and its contents, as well as optional pieces of metadata
- that annotate the meaning or purpose of the object.
- </p>
-
- <p>Data object header messages are either stored directly in the data
- object header for the object or are shared between multiple objects
- in the file. When a message is shared, a flag in the <em>Message Flags</em>
- indicates that the actual <em>Message Data</em>
- portion of that message is stored in another location (such as another
- data object header, or a heap in the file) and the <em>Message Data</em>
- field contains the information needed to locate the actual information
- for the message.
- </p>
-
- <p>
- The format of shared message data is described here:</p>
-
- <div align="center">
- <table class="format">
- <caption>
- Shared Message (Version 1)
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Type</td>
- <td colspan="2">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="4">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
- </tr>
- </table>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>Version</td>
+ <td>Reserved (zero)</td>
+ <td colspan="2">Total Number of Header Messages</td>
+ </tr>
- </div>
+ <tr>
+ <td colspan="4">Object Reference Count</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number is used when there are changes in the format
- of a shared object message and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Never used.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Used by the library before version 1.6.1.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Type</p></td>
- <td><p>The type of shared message location:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Message stored in another object&rsquo;s header (a <em>committed</em>
- message).
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Address</p></td>
- <td><p>The address of the object header
- containing the message to be shared.</p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">Object Header Size</td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Shared Message (Version 2)
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Type</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
- </tr>
- </table>
+ <tr>
+ <td colspan="2">Header Message Type #1</td>
+ <td colspan="2">Size of Header Message Data #1</td>
+ </tr>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
- </div>
+ <td>Header Message #1 Flags</td>
+ <td colspan="3">Reserved (zero)</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number is used when there are changes in the format
- of a shared object message and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Used by the library of version 1.6.1 and after.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Type</p></td>
- <td><p>The type of shared message location:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Message stored in another object&rsquo;s header (a <em>committed</em>
- message).
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Address</p></td>
- <td><p>The address of the object header
- containing the message to be shared.</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Header Message Data #1<br />
+ <br /></td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Shared Message (Version 3)
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Type</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Location <em>(variable size)</em></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number indicates changes in the format of shared
- object message and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>3</code></td>
- <td>Used by the library of version 1.8 and after. In this
- version, the <em>Type</em> field can indicate that
- the message is stored in the fractal heap.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Type</p></td>
- <td><p>The type of shared message location:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Message is not shared and is not shareable.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Message stored in file&rsquo;s <em>shared object header message</em>
- heap (a <em>shared</em> message).
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Message stored in another object&rsquo;s header (a <em>committed</em>
- message).
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>3</code></td>
- <td>Message stored is not shared, but is shareable.
- </td>
- </tr>
-
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Location</p></td>
- <td><p>This field contains either a <em>Size of Offsets</em>-bytes
- address of the object header
- containing the message to be shared, or an 8-byte fractal heap ID
- for the message in the file&rsquo;s <em>shared object header message</em>
- heap.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2">Header Message Type #n</td>
+ <td colspan="2">Size of Header Message Data #n</td>
+ </tr>
+ <tr>
+ <td>Header Message #n Flags</td>
+ <td colspan="3">Reserved (zero)</td>
+ </tr>
- <p>The following is a list of currently defined header messages:
- </p>
+ <tr>
+ <td colspan="4"><br />Header Message Data #n<br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="NILMessage">IV.A.2.a. The NIL Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>This value is used to determine the format of the information
+ in the object header. When the format of the object header is
+ changed, the version number is incremented and can be used to
+ determine how the information in the object header is formatted.
+ This is version one (1) (there was no version zero (0)) of the
+ object header.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Total Number of Header Messages</p></td>
+ <td>
+ <p>This value determines the total number of messages listed in
+ object headers for this object. This value includes the messages in
+ continuation messages for this object.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Object Reference Count</p></td>
+ <td>
+ <p>This value specifies the number of &ldquo;hard links&rdquo;
+ to this object within the current file. References to the object
+ from external files, &ldquo;soft links&rdquo; in this file and
+ object references in this file are not tracked.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Object Header Size</p></td>
+ <td>
+ <p>This value specifies the number of bytes of header message
+ data following this length field that contain object header
+ messages for this object header. This value does not include the
+ size of object header continuation blocks for this object elsewhere
+ in the file.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Type</p></td>
+ <td>
+ <p>This value specifies the type of information included in the
+ following header message data. The message types for header
+ messages are defined in sections below.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size of Header Message #n Data</p></td>
+ <td>
+ <p>This value specifies the number of bytes of header message
+ data following the header message type and length information for
+ the current message. The size includes padding bytes to make the
+ message a multiple of eight bytes.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Flags</p></td>
+ <td>
+ <p>This is a bit field with the following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set, the message data is constant. This is used for
+ messages like the datatype message of a dataset.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>If set, the message is <em>shared</em> and stored in
+ another location than the object header. The Header Message Data
+ field contains a Shared Message (described in the <a
+ href="#ObjectHeaderMessages">Data Object Header Messages</a>
+ section below) and the Size of Header Message Data field contains
+ the size of that Shared Message.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>If set, the message should not be shared.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>If set, the HDF5 decoder should fail to open this object
+ if it does not understand the message&rsquo;s type and the file
+ is open with permissions allowing write access to the file.
+ (Normally, unknown messages can just be ignored by HDF5 decoders)
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>4</code></td>
+ <td>If set, the HDF5 decoder should set bit 5 of this
+ message&rsquo;s flags (in other words, this bit field) if it does
+ not understand the message&rsquo;s type and the object is
+ modified in any way. (Normally, unknown messages can just be
+ ignored by HDF5 decoders)</td>
+ </tr>
+ <tr>
+ <td align="center"><code>5</code></td>
+ <td>If set, this object was modified by software that did not
+ understand this message. (Normally, unknown messages should just
+ be ignored by HDF5 decoders) (Can be used to invalidate an index
+ or a similar feature)</td>
+ </tr>
+ <tr>
+ <td align="center"><code>6</code></td>
+ <td>If set, this message is shareable.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>7</code></td>
+ <td>If set, the HDF5 decoder should always fail to open this
+ object if it does not understand the message&rsquo;s type
+ (whether it is open for read-only or read-write access).
+ (Normally, unknown messages can just be ignored by HDF5 decoders)
+ </td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Data</p></td>
+ <td>
+ <p>The format and length of this field is determined by the
+ header message type and size respectively. Some header message
+ types do not require any data and this information can be
+ eliminated by setting the length of the message to zero. The data
+ is padded with enough zeroes to make the size a multiple of eight.
+ </p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="V2ObjectHeaderPrefix"> IV.A.1.b. Version 2 Data Object
+ Header Prefix</a>
+</h4>
+
+<p>Note that the &ldquo;total number of messages&rdquo; field has
+ been dropped from the data object header prefix in this version. The
+ number of messages in the data object header is just determined by the
+ messages encountered in all the object header blocks.</p>
+
+<p>
+ Note also that the fields and messages in this version of data object
+ headers have <em>no</em> alignment or padding bytes inserted - they are
+ stored packed together.
+</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Version 2 Object Header</caption>
+
+ <tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4">Signature</td>
+ </tr>
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Access time <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Modification Time <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Change Time <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Birth Time <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Maximum # of compact attributes <em>(optional)</em></td>
+ <td colspan="2">Minimum # of dense attributes <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td>Size of Chunk #0 <em>(variable size)</em></td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td>Header Message Type #1</td>
+ <td colspan="2">Size of Header Message Data #1</td>
+ <td>Header Message #1 Flags</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Header Message Data #1<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+
+ <tr>
+ <td>Header Message Type #n</td>
+ <td colspan="2">Size of Header Message Data #n</td>
+ <td>Header Message #n Flags</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Header Message Data #n<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Gap <em>(optional, variable size)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>OHDR</code>
+ &rdquo; is used to indicate the beginning of an object header. This
+ gives file consistency checking utilities a better chance of
+ reconstructing a damaged file.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>This field has a value of 2 indicating version 2 of the
+ object header.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td>
+ <p>This field is a bit field indicating additional information
+ about the object header.</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit(s)</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0-1</code></td>
+ <td>This two bit field determines the size of the <em>Size
+ of Chunk #0</em> field. The values are:
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>The <em>Size of Chunk #0</em> field is 1 byte.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>The <em>Size of Chunk #0</em> field is 2 bytes.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>The <em>Size of Chunk #0</em> field is 4 bytes.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>The <em>Size of Chunk #0</em> field is 8 bytes.
+ </td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>If set, attribute creation order is tracked.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>If set, attribute creation order is indexed.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>4</code></td>
+ <td>If set, non-default attribute storage phase change values
+ are stored.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>5</code></td>
+ <td>If set, access, modification, change and birth times are
+ stored.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>6-7</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Access Time</p></td>
+ <td>
+ <p>This 32-bit value represents the number of seconds after the
+ UNIX epoch when the object&rsquo;s raw data was last accessed (in
+ other words, read or written).</p>
+ <p>
+ This field is present if bit 5 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Modification Time</p></td>
+ <td>
+ <p>This 32-bit value represents the number of seconds after the
+ UNIX epoch when the object&rsquo;s raw data was last modified (in
+ other words, written).</p>
+ <p>
+ This field is present if bit 5 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Change Time</p></td>
+ <td>
+ <p>This 32-bit value represents the number of seconds after the
+ UNIX epoch when the object&rsquo;s metadata was last changed.</p>
+ <p>
+ This field is present if bit 5 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Birth Time</p></td>
+ <td>
+ <p>This 32-bit value represents the number of seconds after the
+ UNIX epoch when the object was created.</p>
+ <p>
+ This field is present if bit 5 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Maximum # of compact attributes</p></td>
+ <td>
+ <p>This is the maximum number of attributes to store in the
+ compact format before switching to the indexed format.</p>
+ <p>
+ This field is present if bit 4 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Minimum # of dense attributes</p></td>
+ <td>
+ <p>This is the minimum number of attributes to store in the
+ indexed format before switching to the compact format.</p>
+ <p>
+ This field is present if bit 4 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size of Chunk #0</p></td>
+ <td>
+ <p>This unsigned value specifies the number of bytes of header
+ message data following this field that contain object header
+ information.</p>
+ <p>This value does not include the size of object header
+ continuation blocks for this object elsewhere in the file.</p>
+ <p>
+ The length of this field varies depending on bits 0 and 1 of the <em>flags</em>
+ field.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Type</p></td>
+ <td>
+ <p>Same format as version 1 of the object header, described
+ above.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size of Header Message #n Data</p></td>
+ <td>
+ <p>
+ This value specifies the number of bytes of header message data
+ following the header message type and length information for the
+ current message. The size of messages in this version does <em>not</em>
+ include any padding bytes.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Flags</p></td>
+ <td>
+ <p>Same format as version 1 of the object header, described
+ above.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Creation Order</p></td>
+ <td>
+ <p>This field stores the order that a message of a given type
+ was created in.</p>
+ <p>
+ This field is present if bit 2 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Data</p></td>
+ <td>
+ <p>Same format as version 1 of the object header, described
+ above.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Gap</p></td>
+ <td>
+ <p>A gap in an object header chunk is inferred by the end of the
+ messages for the chunk before the beginning of the chunk&rsquo;s
+ checksum. Gaps are always smaller than the size of an object header
+ message prefix (message type + message size + message flags).</p>
+ <p>Gaps are formed when a message (typically an attribute
+ message) in an earlier chunk is deleted and a message from a later
+ chunk that does not quite fit into the free space is moved into the
+ earlier chunk.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the object header chunk.</p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<p>The header message types and the message data associated with
+ them compose the critical &ldquo;metadata&rdquo; about each object.
+ Some header messages are required for each object while others are
+ optional. Some optional header messages may also be repeated several
+ times in the header itself, the requirements and number of times
+ allowed in the header will be noted in each header message description
+ below.</p>
+
+
+<br />
+<h3>
+ <a name="ObjectHeaderMessages"> IV.A.2. Disk Format: Level 2A2 -
+ Data Object Header Messages</a>
+</h3>
+
+<p>Data object header messages are small pieces of metadata that are
+ stored in the data object header for each object in an HDF5 file. Data
+ object header messages provide the metadata required to describe an
+ object and its contents, as well as optional pieces of metadata that
+ annotate the meaning or purpose of the object.</p>
+
+<p>
+ Data object header messages are either stored directly in the data
+ object header for the object or are shared between multiple objects in
+ the file. When a message is shared, a flag in the <em>Message
+ Flags</em> indicates that the actual <em>Message Data</em> portion of that
+ message is stored in another location (such as another data object
+ header, or a heap in the file) and the <em>Message Data</em> field
+ contains the information needed to locate the actual information for
+ the message.
+</p>
+
+<p>The format of shared message data is described here:</p>
+
+<div align="center">
+ <table class="format">
+ <caption>Shared Message (Version 1)</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Type</td>
+ <td colspan="2">Reserved (zero)</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Reserved (zero)</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number is used when there are changes in
+ the format of a shared object message and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Never used.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Used by the library before version 1.6.1.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Type</p></td>
+ <td><p>The type of shared message location:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Message stored in another object&rsquo;s header (a <em>committed</em>
+ message).
+ </td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Address</p></td>
+ <td><p>The address of the object header containing the
+ message to be shared.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Shared Message (Version 2)</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Type</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number is used when there are changes in
+ the format of a shared object message and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Used by the library of version 1.6.1 and after.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Type</p></td>
+ <td><p>The type of shared message location:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Message stored in another object&rsquo;s header (a <em>committed</em>
+ message).
+ </td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Address</p></td>
+ <td><p>The address of the object header containing the
+ message to be shared.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Shared Message (Version 3)</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Type</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Location <em>(variable size)</em></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number indicates changes in the format of
+ shared object message and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>Used by the library of version 1.8 and after. In this
+ version, the <em>Type</em> field can indicate that the message is
+ stored in the fractal heap.
+ </td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Type</p></td>
+ <td><p>The type of shared message location:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Message is not shared and is not shareable.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Message stored in file&rsquo;s <em>shared object
+ header message</em> heap (a <em>shared</em> message).
+ </td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Message stored in another object&rsquo;s header (a <em>committed</em>
+ message).
+ </td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>Message stored is not shared, but is shareable.</td>
+ </tr>
+
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Location</p></td>
+ <td><p>
+ This field contains either a <em>Size of Offsets</em>-bytes address
+ of the object header containing the message to be shared, or an
+ 8-byte fractal heap ID for the message in the file&rsquo;s <em>shared
+ object header message</em> heap.
+ </p></td>
+ </tr>
+ </table>
+</div>
+
+
+<p>The following is a list of currently defined header messages:</p>
+
+<br />
+<h4>
+ <a name="NILMessage">IV.A.2.a. The NIL Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> NIL</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0000</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may be repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>The NIL message is used to indicate a message which is to be
- ignored when reading the header messages for a data object.
- [Possibly one which has been deleted for some reason.]
- </td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> Unspecified</td></tr>
- </table></center>
- <!-- end msgdesc table -->
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> NIL</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0000</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The NIL message is used to indicate a message which is to be
+ ignored when reading the header messages for a data object.
+ [Possibly one which has been deleted for some reason.]</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> Unspecified</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
<br />
-<h4><a name="DataspaceMessage">IV.A.2.b. The Dataspace Message</a></h4>
+<h4>
+ <a name="DataspaceMessage">IV.A.2.b. The Dataspace Message</a>
+</h4>
- <!-- start msgdesc table -->
- <center>
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Dataspace</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0001</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies according to the number of
- dimensions, as described in the following table.</td></tr>
- <tr><td colspan="2"><b>Status:</b> Required for dataset objects;
- may not be repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>The dataspace message describes the number of dimensions (in
- other words, &ldquo;rank&rdquo;) and size of each dimension that
- the data object has. This message is only used for datasets which
- have a simple, rectilinear, array-like layout; datasets requiring
- a more complex layout are not yet supported.
- </td>
- </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Dataspace</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0001</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies according to the number of
+ dimensions, as described in the following table.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Required for dataset objects; may
+ not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The dataspace message describes the number of dimensions (in
+ other words, &ldquo;rank&rdquo;) and size of each dimension that the
+ data object has. This message is only used for datasets which have a
+ simple, rectilinear, array-like layout; datasets requiring a more
+ complex layout are not yet supported.</td>
+ </tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Dataspace Message - Version 1
- </caption>
-
- <tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Dimensionality</td>
- <td>Flags</td>
- <td>Reserved</td>
- </tr>
-
- <tr>
- <td colspan="4">Reserved</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Dimension #n Size<sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Permutation Index #1<sup>L</sup> <em>(optional)</em><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Permutation Index #n<sup>L</sup> <em>(optional)</em><br /><br /></td>
- </tr>
- </table>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
+
+<div align="center">
+ <table class="format">
+ <caption>Dataspace Message - Version 1</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
- </div>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>This value is used to determine the format of the
- Dataspace Message. When the format of the
- information in the message is changed, the version number
- is incremented and can be used to determine how the
- information in the object header is formatted. This
- document describes version one (1) (there was no version
- zero (0)).
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimensionality</p></td>
- <td>
- <p>This value is the number of dimensions that the data
- object has.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td>
- <p>This field is used to store flags to indicate the
- presence of parts of this message. Bit 0 (the least
- significant bit) is used to indicate that maximum
- dimensions are present. Bit 1 is used to indicate that
- permutation indices are present.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Size</p></td>
- <td>
- <p>This value is the current size of the dimension of the
- data as stored in the file. The first dimension stored in
- the list of dimensions is the slowest changing dimension
- and the last dimension stored is the fastest changing
- dimension.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Maximum Size</p></td>
- <td>
- <p>This value is the maximum size of the dimension of the
- data as stored in the file. This value may be the special
- &ldquo;<a href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
- that the data may expand along this dimension indefinitely.
- If these values are not stored, the maximum size of each
- dimension is assumed to be the dimension&rsquo;s current size.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Permutation Index #n</p></td>
- <td>
- <p>This value is the index permutation used to map
- each dimension from the canonical representation to an
- alternate axis for each dimension. If these values are
- not stored, the first dimension stored in the list of
- dimensions is the slowest changing dimension and the last
- dimension stored is the fastest changing dimension.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td>Version</td>
+ <td>Dimensionality</td>
+ <td>Flags</td>
+ <td>Reserved</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Reserved</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Dimension #n Size<sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Permutation Index #1<sup>L</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Permutation Index #n<sup>L</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Lengths&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+</div>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <br />
- <p>Version 2 of the dataspace message dropped the optional
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>This value is used to determine the format of the Dataspace
+ Message. When the format of the information in the message is
+ changed, the version number is incremented and can be used to
+ determine how the information in the object header is formatted.
+ This document describes version one (1) (there was no version zero
+ (0)).</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimensionality</p></td>
+ <td>
+ <p>This value is the number of dimensions that the data object
+ has.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td>
+ <p>This field is used to store flags to indicate the presence of
+ parts of this message. Bit 0 (the least significant bit) is used to
+ indicate that maximum dimensions are present. Bit 1 is used to
+ indicate that permutation indices are present.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Size</p></td>
+ <td>
+ <p>This value is the current size of the dimension of the data
+ as stored in the file. The first dimension stored in the list of
+ dimensions is the slowest changing dimension and the last dimension
+ stored is the fastest changing dimension.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Maximum Size</p></td>
+ <td>
+ <p>
+ This value is the maximum size of the dimension of the data as
+ stored in the file. This value may be the special &ldquo;<a
+ href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
+ that the data may expand along this dimension indefinitely. If
+ these values are not stored, the maximum size of each dimension is
+ assumed to be the dimension&rsquo;s current size.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Permutation Index #n</p></td>
+ <td>
+ <p>This value is the index permutation used to map each
+ dimension from the canonical representation to an alternate axis
+ for each dimension. If these values are not stored, the first
+ dimension stored in the list of dimensions is the slowest changing
+ dimension and the last dimension stored is the fastest changing
+ dimension.</p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+
+
+<br />
+<p>Version 2 of the dataspace message dropped the optional
permutation index value support, as it was never implemented in the
HDF5 Library:</p>
- <div align="center">
- <table class="format">
- <caption>
- Dataspace Message - Version 2
- </caption>
-
- <tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Dimensionality</td>
- <td>Flags</td>
- <td>Type</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Dimension #n Size<sup>L</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
- </tr>
- </table>
+<div align="center">
+ <table class="format">
+ <caption>Dataspace Message - Version 2</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
- </div>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>This value is used to determine the format of the
- Dataspace Message. This field should be &lsquo;2&rsquo; for version 2
- format messages.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimensionality</p></td>
- <td>
- <p>This value is the number of dimensions that the data object has.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td>
- <p>This field is used to store flags to indicate the
- presence of parts of this message. Bit 0 (the least
- significant bit) is used to indicate that maximum
- dimensions are present.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Type</p></td>
- <td>
- <p>This field indicates the type of the dataspace:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>A <em>scalar</em> dataspace; in other words,
- a dataspace with a single, dimensionless element.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>A <em>simple</em> dataspace; in other words,
- a dataspace with a rank > 0 and an appropriate # of
- dimensions.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2</code></td>
- <td>A <em>null</em> dataspace; in other words,
- a dataspace with no elements.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Size</p></td>
- <td>
- <p>This value is the current size of the dimension of the
- data as stored in the file. The first dimension stored in
- the list of dimensions is the slowest changing dimension
- and the last dimension stored is the fastest changing
- dimension.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Maximum Size</p></td>
- <td>
- <p>This value is the maximum size of the dimension of the
- data as stored in the file. This value may be the special
- &ldquo;<a href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
- that the data may expand along this dimension indefinitely.
- If these values are not stored, the maximum size of each
- dimension is assumed to be the dimension&rsquo;s current size.
- </p>
- </td>
- </tr>
+ <tr>
+ <td>Version</td>
+ <td>Dimensionality</td>
+ <td>Flags</td>
+ <td>Type</td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Dimension #n Size<sup>L</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Lengths&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>This value is used to determine the format of the Dataspace
+ Message. This field should be &lsquo;2&rsquo; for version 2 format
+ messages.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimensionality</p></td>
+ <td>
+ <p>This value is the number of dimensions that the data object
+ has.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td>
+ <p>This field is used to store flags to indicate the presence of
+ parts of this message. Bit 0 (the least significant bit) is used to
+ indicate that maximum dimensions are present.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Type</p></td>
+ <td>
+ <p>This field indicates the type of the dataspace:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>A <em>scalar</em> dataspace; in other words, a dataspace
+ with a single, dimensionless element.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>A <em>simple</em> dataspace; in other words, a dataspace
+ with a rank > 0 and an appropriate # of dimensions.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>A <em>null</em> dataspace; in other words, a dataspace
+ with no elements.
+ </td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Size</p></td>
+ <td>
+ <p>This value is the current size of the dimension of the data
+ as stored in the file. The first dimension stored in the list of
+ dimensions is the slowest changing dimension and the last dimension
+ stored is the fastest changing dimension.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Maximum Size</p></td>
+ <td>
+ <p>
+ This value is the maximum size of the dimension of the data as
+ stored in the file. This value may be the special &ldquo;<a
+ href="#UnlimitedDim">unlimited</a>&rdquo; size which indicates
+ that the data may expand along this dimension indefinitely. If
+ these values are not stored, the maximum size of each dimension is
+ assumed to be the dimension&rsquo;s current size.
+ </p>
+ </td>
+ </tr>
+
+ </table>
+</div>
@@ -8287,22 +8431,22 @@ IV.A.2. Disk Format: Level 2A2 - Data Object Header Messages</a></h3>
<center>
<table border cellpadding="4" width="80%">
- <caption align="bottom">
- <b>HDF5 Dataspace Message Layout</b>
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
+ <caption align="bottom">
+ <b>HDF5 Dataspace Message Layout</b>
+ </caption>
+
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
</tr>
- <tr align="center">
- <td colspan="4">Mesh Type</td>
+ <tr align="center">
+ <td colspan="4">Mesh Type</td>
</tr>
- <tr align="center">
- <td colspan="4">Logical Dimensionality</td>
+ <tr align="center">
+ <td colspan="4">Logical Dimensionality</td>
</tr>
</table>
</center>
@@ -8311,156 +8455,156 @@ IV.A.2. Disk Format: Level 2A2 - Data Object Header Messages</a></h3>
<dl>
<dt>The elements of the dimensionality message are described below:
<dd>
- <dl>
- <dt>Mesh Type: (unsigned 32-bit integer)
- <dd>This value indicates whether the grid is
- polar/spherical/cartesion,
- structured/unstructured and regular/irregular. <br />
- The mesh type value is broken up as follows: <br />
-
- <br />
- <center>
- <table border cellpadding="4" width="80%">
- <caption align="bottom">
- <b>HDF5 Mesh-type Layout</b>
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr align="center">
- <td colspan="1">Mesh Embedding</td>
- <td colspan="1">Coordinate System</td>
- <td colspan="1">Structure</td>
- <td colspan="1">Regularity</td>
- </tr>
- </table>
- </center>
- The following are the definitions of mesh-type bytes:
- <dl>
- <dt>Mesh Embedding
- <dd>This value indicates whether the dataset dataspace
- is located within
- another dataspace or not:
- <dl> <dl>
- <dt>&lt;STANDALONE&gt;
- <dd>The dataset mesh is self-contained and is not
- embedded in another mesh.
- <dt>&lt;EMBEDDED&gt;
- <dd>The dataset&rsquo;s dataspace is located within
- another dataspace, as
- described in information below.
- </dl> </dl>
- <dt>Coordinate System
- <dd>This value defines the type of coordinate system
- used for the mesh:
- <dl> <dl>
- <dt>&lt;POLAR&gt;
- <dd>The last two dimensions are in polar
- coordinates, higher dimensions are
- cartesian.
- <dt>&lt;SPHERICAL&gt;
- <dd>The last three dimensions are in spherical
- coordinates, higher dimensions
- are cartesian.
- <dt>&lt;CARTESIAN&gt;
- <dd>All dimensions are in cartesian coordinates.
- </dl> </dl>
- <dt>Structure
- <dd>This value defines the locations of the grid-points
- on the axes:
- <dl> <dl>
- <dt>&lt;STRUCTURED&gt;
- <dd>All grid-points are on integral, sequential
- locations, starting from 0.
- <dt>&lt;UNSTRUCTURED&gt;
- <dd>Grid-points locations in each dimension are
- explicitly defined and
- may be of any numeric datatype.
- </dl> </dl>
- <dt>Regularity
- <dd>This value defines the locations of the dataset
- points on the grid:
- <dl> <dl>
- <dt>&lt;REGULAR&gt;
- <dd>All dataset elements are located at the
- grid-points defined.
- <dt>&lt;IRREGULAR&gt;
- <dd>Each dataset element has a particular
- grid-location defined.
- </dl> </dl>
- </dl>
- <p>The following grid combinations are currently allowed:</p>
- <dl> <dl>
- <dt>&lt;POLAR-STRUCTURED-REGULAR&gt;
- <dt>&lt;SPHERICAL-STRUCTURED-REGULAR&gt;
- <dt>&lt;CARTESIAN-STRUCTURED-REGULAR&gt;
- <dt>&lt;POLAR-UNSTRUCTURED-REGULAR&gt;
- <dt>&lt;SPHERICAL-UNSTRUCTURED-REGULAR&gt;
- <dt>&lt;CARTESIAN-UNSTRUCTURED-REGULAR&gt;
- <dt>&lt;CARTESIAN-UNSTRUCTURED-IRREGULAR&gt;
- </dl> </dl>
- All of the above grid types can be embedded within another
- dataspace.
- <br /> <br />
- <dt>Logical Dimensionality: (unsigned 32-bit integer)
- <dd>This value is the number of dimensions that the dataset occupies.
-
- <br />
- <center>
- <table border cellpadding="4" width="80%">
- <caption align="bottom">
- <b>HDF5 Dataspace Embedded Dimensionality Information</b>
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr align="center">
- <td colspan="4">Embedded Dimensionality</td>
- </tr>
- <tr align="center">
- <td colspan="4">Embedded Dimension Size #1</td>
- </tr>
- <tr align="center">
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr align="center">
- <td colspan="4">Embedded Dimension Size #n</td>
- </tr>
- <tr align="center">
- <td colspan="4">Embedded Origin Location #1</td>
- </tr>
- <tr align="center">
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr align="center">
- <td colspan="4">Embedded Origin Location #n</td>
- </tr>
- </table>
- </center>
-
- <dt>Embedded Dimensionality: (unsigned 32-bit integer)
- <dd>This value is the number of dimensions of the space the
- dataset is located within: in other words, a planar dataset
+ <dl>
+ <dt>Mesh Type: (unsigned 32-bit integer)
+ <dd>This value indicates whether the grid is
+ polar/spherical/cartesion,
+ structured/unstructured and regular/irregular. <br />
+ The mesh type value is broken up as follows: <br />
+
+ <br />
+ <center>
+ <table border cellpadding="4" width="80%">
+ <caption align="bottom">
+ <b>HDF5 Mesh-type Layout</b>
+ </caption>
+
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr align="center">
+ <td colspan="1">Mesh Embedding</td>
+ <td colspan="1">Coordinate System</td>
+ <td colspan="1">Structure</td>
+ <td colspan="1">Regularity</td>
+ </tr>
+ </table>
+ </center>
+ The following are the definitions of mesh-type bytes:
+ <dl>
+ <dt>Mesh Embedding
+ <dd>This value indicates whether the dataset dataspace
+ is located within
+ another dataspace or not:
+ <dl> <dl>
+ <dt>&lt;STANDALONE&gt;
+ <dd>The dataset mesh is self-contained and is not
+ embedded in another mesh.
+ <dt>&lt;EMBEDDED&gt;
+ <dd>The dataset&rsquo;s dataspace is located within
+ another dataspace, as
+ described in information below.
+ </dl> </dl>
+ <dt>Coordinate System
+ <dd>This value defines the type of coordinate system
+ used for the mesh:
+ <dl> <dl>
+ <dt>&lt;POLAR&gt;
+ <dd>The last two dimensions are in polar
+ coordinates, higher dimensions are
+ cartesian.
+ <dt>&lt;SPHERICAL&gt;
+ <dd>The last three dimensions are in spherical
+ coordinates, higher dimensions
+ are cartesian.
+ <dt>&lt;CARTESIAN&gt;
+ <dd>All dimensions are in cartesian coordinates.
+ </dl> </dl>
+ <dt>Structure
+ <dd>This value defines the locations of the grid-points
+ on the axes:
+ <dl> <dl>
+ <dt>&lt;STRUCTURED&gt;
+ <dd>All grid-points are on integral, sequential
+ locations, starting from 0.
+ <dt>&lt;UNSTRUCTURED&gt;
+ <dd>Grid-points locations in each dimension are
+ explicitly defined and
+ may be of any numeric datatype.
+ </dl> </dl>
+ <dt>Regularity
+ <dd>This value defines the locations of the dataset
+ points on the grid:
+ <dl> <dl>
+ <dt>&lt;REGULAR&gt;
+ <dd>All dataset elements are located at the
+ grid-points defined.
+ <dt>&lt;IRREGULAR&gt;
+ <dd>Each dataset element has a particular
+ grid-location defined.
+ </dl> </dl>
+ </dl>
+ <p>The following grid combinations are currently allowed:</p>
+ <dl> <dl>
+ <dt>&lt;POLAR-STRUCTURED-REGULAR&gt;
+ <dt>&lt;SPHERICAL-STRUCTURED-REGULAR&gt;
+ <dt>&lt;CARTESIAN-STRUCTURED-REGULAR&gt;
+ <dt>&lt;POLAR-UNSTRUCTURED-REGULAR&gt;
+ <dt>&lt;SPHERICAL-UNSTRUCTURED-REGULAR&gt;
+ <dt>&lt;CARTESIAN-UNSTRUCTURED-REGULAR&gt;
+ <dt>&lt;CARTESIAN-UNSTRUCTURED-IRREGULAR&gt;
+ </dl> </dl>
+ All of the above grid types can be embedded within another
+ dataspace.
+ <br /> <br />
+ <dt>Logical Dimensionality: (unsigned 32-bit integer)
+ <dd>This value is the number of dimensions that the dataset occupies.
+
+ <br />
+ <center>
+ <table border cellpadding="4" width="80%">
+ <caption align="bottom">
+ <b>HDF5 Dataspace Embedded Dimensionality Information</b>
+ </caption>
+
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr align="center">
+ <td colspan="4">Embedded Dimensionality</td>
+ </tr>
+ <tr align="center">
+ <td colspan="4">Embedded Dimension Size #1</td>
+ </tr>
+ <tr align="center">
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr align="center">
+ <td colspan="4">Embedded Dimension Size #n</td>
+ </tr>
+ <tr align="center">
+ <td colspan="4">Embedded Origin Location #1</td>
+ </tr>
+ <tr align="center">
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr align="center">
+ <td colspan="4">Embedded Origin Location #n</td>
+ </tr>
+ </table>
+ </center>
+
+ <dt>Embedded Dimensionality: (unsigned 32-bit integer)
+ <dd>This value is the number of dimensions of the space the
+ dataset is located within: in other words, a planar dataset
located within a 3-D space, a 3-D dataset
- which is a subset of another 3-D space, and so on.
- <dt>Embedded Dimension Size: (unsigned 32-bit integer)
- <dd>These values are the sizes of the dimensions of the
- embedded dataspace
- that the dataset is located within.
- <dt>Embedded Origin Location: (unsigned 32-bit integer)
- <dd>These values comprise the location of the dataset&rsquo;s
- origin within the embedded dataspace.
- </dl>
+ which is a subset of another 3-D space, and so on.
+ <dt>Embedded Dimension Size: (unsigned 32-bit integer)
+ <dd>These values are the sizes of the dimensions of the
+ embedded dataspace
+ that the dataset is located within.
+ <dt>Embedded Origin Location: (unsigned 32-bit integer)
+ <dd>These values comprise the location of the dataset&rsquo;s
+ origin within the embedded dataspace.
+ </dl>
</dl>
[Comment: need some way to handle different orientations of the
dataset dataspace
@@ -8469,31 +8613,31 @@ IV.A.2. Disk Format: Level 2A2 - Data Object Header Messages</a></h3>
<br />
<center>
<table border cellpadding="4" width="80%">
- <caption align="bottom">
- <b>HDF5 Dataspace Structured/Regular Grid Information</b>
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
+ <caption align="bottom">
+ <b>HDF5 Dataspace Structured/Regular Grid Information</b>
+ </caption>
+
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
</tr>
- <tr align="center">
- <td colspan="4">Logical Dimension Size #1</td>
+ <tr align="center">
+ <td colspan="4">Logical Dimension Size #1</td>
</tr>
- <tr align="center">
- <td colspan="4">Logical Dimension Maximum #1</td>
+ <tr align="center">
+ <td colspan="4">Logical Dimension Maximum #1</td>
</tr>
- <tr align="center">
- <td colspan="4">.<br />.<br />.<br /></td>
+ <tr align="center">
+ <td colspan="4">.<br />.<br />.<br /></td>
</tr>
- <tr align="center">
- <td colspan="4">Logical Dimension Size #n</td>
+ <tr align="center">
+ <td colspan="4">Logical Dimension Size #n</td>
</tr>
- <tr align="center">
- <td colspan="4">Logical Dimension Maximum #n</td>
+ <tr align="center">
+ <td colspan="4">Logical Dimension Maximum #n</td>
</tr>
</table>
</center>
@@ -8502,58 +8646,58 @@ IV.A.2. Disk Format: Level 2A2 - Data Object Header Messages</a></h3>
<dl>
<dt>The elements of the dimensionality message are described below:
<dd>
- <dl>
- <dt>Logical Dimension Size #n: (unsigned 32-bit integer)
- <dd>This value is the current size of the dimension of the
- data as stored in
- the file. The first dimension stored in the list of
- dimensions is the slowest
- changing dimension and the last dimension stored is the
- fastest changing
- dimension.
- <dt>Logical Dimension Maximum #n: (unsigned 32-bit integer)
- <dd>This value is the maximum size of the dimension of the
- data as stored in
- the file. This value may be the special value
- &lt;UNLIMITED&gt; which
- indicates that the data may expand along this dimension
- indefinitely.
- </dl>
+ <dl>
+ <dt>Logical Dimension Size #n: (unsigned 32-bit integer)
+ <dd>This value is the current size of the dimension of the
+ data as stored in
+ the file. The first dimension stored in the list of
+ dimensions is the slowest
+ changing dimension and the last dimension stored is the
+ fastest changing
+ dimension.
+ <dt>Logical Dimension Maximum #n: (unsigned 32-bit integer)
+ <dd>This value is the maximum size of the dimension of the
+ data as stored in
+ the file. This value may be the special value
+ &lt;UNLIMITED&gt; which
+ indicates that the data may expand along this dimension
+ indefinitely.
+ </dl>
</dl>
<br />
<center>
<table border cellpadding="4" width="80%">
- <caption align="bottom">
- <b>HDF5 Dataspace Structured/Irregular Grid Information</b>
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
+ <caption align="bottom">
+ <b>HDF5 Dataspace Structured/Irregular Grid Information</b>
+ </caption>
+
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
</tr>
- <tr align="center">
- <td colspan="4"># of Grid Points in Dimension #1</td>
+ <tr align="center">
+ <td colspan="4"># of Grid Points in Dimension #1</td>
</tr>
- <tr align="center">
- <td colspan="4">.<br />.<br />.<br /></td>
+ <tr align="center">
+ <td colspan="4">.<br />.<br />.<br /></td>
</tr>
- <tr align="center">
- <td colspan="4"># of Grid Points in Dimension #n</td>
+ <tr align="center">
+ <td colspan="4"># of Grid Points in Dimension #n</td>
</tr>
- <tr align="center">
- <td colspan="4">Datatype of Grid Point Locations</td>
+ <tr align="center">
+ <td colspan="4">Datatype of Grid Point Locations</td>
</tr>
- <tr align="center">
- <td colspan="4">Location of Grid Points in Dimension #1</td>
+ <tr align="center">
+ <td colspan="4">Location of Grid Points in Dimension #1</td>
</tr>
- <tr align="center">
- <td colspan="4">.<br />.<br />.<br /></td>
+ <tr align="center">
+ <td colspan="4">.<br />.<br />.<br /></td>
</tr>
- <tr align="center">
- <td colspan="4">Location of Grid Points in Dimension #n</td>
+ <tr align="center">
+ <td colspan="4">Location of Grid Points in Dimension #n</td>
</tr>
</table>
</center>
@@ -8561,6342 +8705,6548 @@ IV.A.2. Disk Format: Level 2A2 - Data Object Header Messages</a></h3>
<br />
<center>
<table border cellpadding="4" width="80%">
- <caption align="bottom">
- <b>HDF5 Dataspace Unstructured Grid Information</b>
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
+ <caption align="bottom">
+ <b>HDF5 Dataspace Unstructured Grid Information</b>
+ </caption>
+
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
</tr>
- <tr align="center">
- <td colspan="4"># of Grid Points</td>
+ <tr align="center">
+ <td colspan="4"># of Grid Points</td>
</tr>
- <tr align="center">
- <td colspan="4">Datatype of Grid Point Locations</td>
+ <tr align="center">
+ <td colspan="4">Datatype of Grid Point Locations</td>
</tr>
- <tr align="center">
- <td colspan="4">Grid Point Locations<br />.<br />.<br /></td>
+ <tr align="center">
+ <td colspan="4">Grid Point Locations<br />.<br />.<br /></td>
</tr>
</table>
</center>
-->
<br />
-<h4><a name="LinkInfoMessage">IV.A.2.c. The Link Info Message</a></h4>
+<h4>
+ <a name="LinkInfoMessage">IV.A.2.c. The Link Info Message</a>
+</h4>
- <!-- start msgdesc table -->
- <center>
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Link Info</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x002 </td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies </td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated. </td></tr>
- <tr><td><b>Description:</b></td>
- <td>The link info message tracks variable information about the
- current state of the links for a &ldquo;new style&rdquo;
- group&rsquo;s behavior. Variable information will be stored in
- this message and constant information will be stored in the
- <a href="#GroupInfoMessage">Group Info</a> message.
- </td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Link Info
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Maximum Creation Index <em>(8 bytes, optional)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address of v2 B-tree for Name Index<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address of v2 B-tree for Creation Order Index<sup>O</sup> <em>(optional)</em><br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Link Info</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x002</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The link info message tracks variable information about the
+ current state of the links for a &ldquo;new style&rdquo;
+ group&rsquo;s behavior. Variable information will be stored in this
+ message and constant information will be stored in the <a
+ href="#GroupInfoMessage">Group Info</a> message.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- </table>
+<div align="center">
+ <table class="format">
+ <caption>Link Info</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
- </div>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number for this message. This document describes
- version 0.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>This field determines various optional aspects of the link
- info message:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set, creation order for the links is tracked.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>If set, creation order for the links is indexed.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2-7</code></td>
- <td>Reserved</td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Maximum Creation Index</p></td>
- <td><p>This 64-bit value is the maximum creation order index value
- stored for a link in this group.</p>
- <p>This field is present if bit 0 of <em>flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Fractal Heap Address</p></td>
- <td>
- <p>
- This is the address of the fractal heap to store dense links.
- Each link stored in the fractal heap is stored as a
- <a href="#LinkMessage">Link Message</a>.
- </p>
- <p>
- If there are no links in the group, or the group&rsquo;s links
- are stored &ldquo;compactly&rdquo; (as object header messages), this
- value will be the <a href="#UndefinedAddress">undefined
- address</a>.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Address of v2 B-tree for Name Index</p></td>
- <td><p>This is the address of the version 2 B-tree to index names of links.</p>
- <p>If there are no links in the group, or the group&rsquo;s links
- are stored &ldquo;compactly&rdquo; (as object header messages), this
- value will be the <a href="#UndefinedAddress">undefined
- address</a>.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Address of v2 B-tree for Creation Order Index</p></td>
- <td><p>This is the address of the version 2 B-tree to index creation order of links.</p>
- <p>If there are no links in the group, or the group&rsquo;s links
- are stored &ldquo;compactly&rdquo; (as object header messages), this
- value will be the <a href="#UndefinedAddress">undefined
- address</a>.
- </p>
- <p>This field exists if bit 1 of <em>flags</em> is set.</p>
- </td>
- </tr>
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Maximum Creation Index <em>(8 bytes,
+ optional)</em><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address of v2 B-tree for Name Index<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address of v2 B-tree for Creation Order
+ Index<sup>O</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
+
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="DatatypeMessage">IV.A.2.d. The Datatype Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
- <table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Datatype</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0003
- </td></tr>
- <tr><td colspan="2"><b>Length:</b> Variable</td></tr>
- <tr><td colspan="2"><b>Status:</b> Required for dataset or committed
- datatype (formerly named datatype) objects; may not be repeated.
- </td></tr>
- <tr><td><b>Description:</b></td>
- <td><p>The datatype message defines the datatype for each element
- of a dataset or a common datatype for sharing between multiple
- datasets. A datatype can describe an atomic type like a fixed-
- or floating-point type or more complex types like a C struct
- (compound datatype), array (array datatype) or C++ vector
- (variable-length datatype).</p>
- <p>Datatype messages that are part of a dataset object do not
- describe how elements are related to one another; the dataspace
- message is used for that purpose. Datatype messages that are part of
- a committed datatype (formerly named datatype) message describe
- a common datatype that can be shared by multiple datasets in the
- file.</p>
- </td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Datatype Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Class and Version</td>
- <td>Class Bit Field, Bits 0-7</td>
- <td>Class Bit Field, Bits 8-15</td>
- <td>Class Bit Field, Bits 16-23</td>
- </tr>
-
- <tr>
- <td colspan="4">Size</td>
- </tr>
-
- <tr>
- <td colspan="4"><br /><br />Properties<br /><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number for this message. This document describes
+ version 0.</p>
+ </td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Class and Version</p></td>
- <td>
- <p>The version of the datatype message and the datatype&rsquo;s class
- information are packed together in this field. The version
- number is packed in the top 4 bits of the field and the class
- is contained in the bottom 4 bits.
- </p>
- <p>The version number information is used for changes in the
- format of the datatype message and is described here:
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>This field determines various optional aspects of the
+ link info message:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>Never used
- </td>
+ <td align="center"><code>0</code></td>
+ <td>If set, creation order for the links is tracked.</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>Used by early versions of the library to encode
- compound datatypes with explicit array fields.
- See the compound datatype description below for
- further details.
- </td>
+ <td align="center"><code>1</code></td>
+ <td>If set, creation order for the links is indexed.</td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>Used when an array datatype needs to be encoded.
- </td>
+ <td align="center"><code>2-7</code></td>
+ <td>Reserved</td>
</tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Maximum Creation Index</p></td>
+ <td><p>This 64-bit value is the maximum creation order index
+ value stored for a link in this group.</p>
+ <p>
+ This field is present if bit 0 of <em>flags</em> is set.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Fractal Heap Address</p></td>
+ <td>
+ <p>
+ This is the address of the fractal heap to store dense links. Each
+ link stored in the fractal heap is stored as a <a
+ href="#LinkMessage">Link Message</a>.
+ </p>
+ <p>
+ If there are no links in the group, or the group&rsquo;s links are
+ stored &ldquo;compactly&rdquo; (as object header messages), this
+ value will be the <a href="#UndefinedAddress">undefined address</a>.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Address of v2 B-tree for Name Index</p></td>
+ <td><p>This is the address of the version 2 B-tree to index
+ names of links.</p>
+ <p>
+ If there are no links in the group, or the group&rsquo;s links are
+ stored &ldquo;compactly&rdquo; (as object header messages), this
+ value will be the <a href="#UndefinedAddress">undefined address</a>.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Address of v2 B-tree for Creation Order Index</p></td>
+ <td><p>This is the address of the version 2 B-tree to index
+ creation order of links.</p>
+ <p>
+ If there are no links in the group, or the group&rsquo;s links are
+ stored &ldquo;compactly&rdquo; (as object header messages), this
+ value will be the <a href="#UndefinedAddress">undefined address</a>.
+ </p>
+ <p>
+ This field exists if bit 1 of <em>flags</em> is set.
+ </p></td>
+ </tr>
+
+ </table>
+</div>
+
+
+<br />
+<h4>
+ <a name="DatatypeMessage">IV.A.2.d. The Datatype Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
+ <table class="msgdesc">
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Datatype</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0003</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Variable</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Required for dataset or committed
+ datatype (formerly named datatype) objects; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td><p>The datatype message defines the datatype for each
+ element of a dataset or a common datatype for sharing between
+ multiple datasets. A datatype can describe an atomic type like a
+ fixed- or floating-point type or more complex types like a C struct
+ (compound datatype), array (array datatype) or C++ vector
+ (variable-length datatype).</p>
+ <p>Datatype messages that are part of a dataset object do not
+ describe how elements are related to one another; the dataspace
+ message is used for that purpose. Datatype messages that are part
+ of a committed datatype (formerly named datatype) message describe
+ a common datatype that can be shared by multiple datasets in the
+ file.</p></td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
+
+<div align="center">
+ <table class="format">
+ <caption>Datatype Message</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Class and Version</td>
+ <td>Class Bit Field, Bits 0-7</td>
+ <td>Class Bit Field, Bits 8-15</td>
+ <td>Class Bit Field, Bits 16-23</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />
+ <br />Properties<br />
+ <br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Class and Version</p></td>
+ <td>
+ <p>The version of the datatype message and the datatype&rsquo;s
+ class information are packed together in this field. The version
+ number is packed in the top 4 bits of the field and the class is
+ contained in the bottom 4 bits.</p>
+ <p>The version number information is used for changes in the
+ format of the datatype message and is described here:</p>
+ <table class="list">
<tr>
- <td align="center"><code>3</code></td>
- <td>Used when a VAX byte-ordered type needs to be
- encoded. Packs various other datatype classes more
- efficiently also.
- </td>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
</tr>
- </table></p>
- <p>The class of the datatype determines the format for the class
- bit field and properties portion of the datatype message, which
- are described below. The
- following classes are currently defined:
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Never used</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Used by early versions of the library to encode compound
+ datatypes with explicit array fields. See the compound datatype
+ description below for further details.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Used when an array datatype needs to be encoded.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>Used when a VAX byte-ordered type needs to be encoded.
+ Packs various other datatype classes more efficiently also.</td>
+ </tr>
+ </table>
+ <p></p>
+ <p>The class of the datatype determines the format for the class
+ bit field and properties portion of the datatype message, which are
+ described below. The following classes are currently defined:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>Fixed-Point</td>
+ <td align="center"><code>0</code></td>
+ <td>Fixed-Point</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>Floating-Point</td>
+ <td align="center"><code>1</code></td>
+ <td>Floating-Point</td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>Time</td>
+ <td align="center"><code>2</code></td>
+ <td>Time</td>
</tr>
<tr>
- <td align="center"><code>3</code></td>
- <td>String</td>
+ <td align="center"><code>3</code></td>
+ <td>String</td>
</tr>
<tr>
- <td align="center"><code>4</code></td>
- <td>Bit field</td>
+ <td align="center"><code>4</code></td>
+ <td>Bit field</td>
</tr>
<tr>
- <td align="center"><code>5</code></td>
- <td>Opaque</td>
+ <td align="center"><code>5</code></td>
+ <td>Opaque</td>
</tr>
<tr>
- <td align="center"><code>6</code></td>
- <td>Compound</td>
+ <td align="center"><code>6</code></td>
+ <td>Compound</td>
</tr>
<tr>
- <td align="center"><code>7</code></td>
- <td>Reference</td>
+ <td align="center"><code>7</code></td>
+ <td>Reference</td>
</tr>
<tr>
- <td align="center"><code>8</code></td>
- <td>Enumerated</td>
+ <td align="center"><code>8</code></td>
+ <td>Enumerated</td>
</tr>
<tr>
- <td align="center"><code>9</code></td>
- <td>Variable-Length</td>
+ <td align="center"><code>9</code></td>
+ <td>Variable-Length</td>
</tr>
<tr>
- <td align="center"><code>10</code></td>
- <td>Array</td>
+ <td align="center"><code>10</code></td>
+ <td>Array</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- </td>
- </tr>
+ </td>
+ </tr>
- <tr>
- <td><p>Class Bit Fields</p></td>
- <td>
- <p>The information in these bit fields is specific to each datatype
- class and is described below. All bits not defined for a
- datatype class are set to zero.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>Class Bit Fields</p></td>
+ <td>
+ <p>The information in these bit fields is specific to each
+ datatype class and is described below. All bits not defined for a
+ datatype class are set to zero.</p>
+ </td>
+ </tr>
- <tr>
- <td><p>Size</p></td>
- <td>
- <p>The size of a datatype element in bytes.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>Size</p></td>
+ <td>
+ <p>The size of a datatype element in bytes.</p>
+ </td>
+ </tr>
- <tr>
- <td><p>Properties</p></td>
- <td>
- <p>This variable-sized sequence of bytes encodes information
- specific to each datatype class and is described for each class
- below. If there is no property information specified for a
- datatype class, the size of this field is zero bytes.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>Properties</p></td>
+ <td>
+ <p>This variable-sized sequence of bytes encodes information
+ specific to each datatype class and is described for each class
+ below. If there is no property information specified for a datatype
+ class, the size of this field is zero bytes.</p>
+ </td>
+ </tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>Class specific information for Fixed-Point Numbers (Class 0):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Fixed-point Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0</p></td>
- <td><p><b>Byte Order.</b> If zero, byte order is little-endian;
- otherwise, byte order is big endian.</p></td>
- </tr>
-
- <tr>
- <td><p>1, 2</p></td>
- <td><p><b>Padding type.</b> Bit 1 is the lo_pad bit and bit 2
- is the hi_pad bit. If a datum has unused bits at either
- end, then the lo_pad or hi_pad bit is copied to those
- locations.</p></td>
- </tr>
-
- <tr>
- <td><p>3</p></td>
- <td><p><b>Signed.</b> If this bit is set then the fixed-point
- number is in 2&rsquo;s complement form.</p></td>
- </tr>
-
- <tr>
- <td><p>4-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+<br />
+<p>Class specific information for Fixed-Point Numbers (Class 0):</p>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fixed-Point Property Description
- </caption>
-
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
-
- <tr>
- <td colspan="2">Bit Offset</td>
- <td colspan="2">Bit Precision</td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="desc">
+ <caption>Fixed-point Bit Field Description</caption>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Bit Offset</p></td>
- <td>
- <p>The bit offset of the first significant bit of the fixed-point
- value within the datatype. The bit offset specifies the number
- of bits &ldquo;to the right of&rdquo; the value (which are set to the
- lo_pad bit value).
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Bit Precision</p></td>
- <td>
- <p>The number of bits of precision of the fixed-point value
- within the datatype. This value, combined with the datatype
- element&rsquo;s size and the Bit Offset field specifies the number
- of bits &ldquo;to the left of&rdquo; the value (which are set to the
- hi_pad bit value).
- </p>
- </td>
- </tr>
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>0</p></td>
+ <td><p>
+ <b>Byte Order.</b> If zero, byte order is little-endian; otherwise,
+ byte order is big endian.
+ </p></td>
+ </tr>
+ <tr>
+ <td><p>1, 2</p></td>
+ <td><p>
+ <b>Padding type.</b> Bit 1 is the lo_pad bit and bit 2 is the
+ hi_pad bit. If a datum has unused bits at either end, then the
+ lo_pad or hi_pad bit is copied to those locations.
+ </p></td>
+ </tr>
- <br />
- <p>Class specific information for Floating-Point Numbers (Class 1):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Floating-Point Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0, 6</p></td>
- <td><p><b>Byte Order.</b> These two non-contiguous bits specify the
- &ldquo;endianness&rdquo; of the bytes in the datatype element.
- <table class="list">
- <tr>
- <th width="10%" align="center">Bit 6</th>
- <th width="10%" align="center">Bit 0</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td align="center"><code>0</code></td>
- <td>Byte order is little-endian
- </td>
- </tr>
- <tr>
- <td align="center"><code>0</code></td>
- <td align="center"><code>1</code></td>
- <td>Byte order is big-endian
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td align="center"><code>0</code></td>
- <td>Reserved
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td align="center"><code>1</code></td>
- <td>Byte order is VAX-endian
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>1, 2, 3</p></td>
- <td><p><b>Padding type.</b> Bit 1 is the low bits pad type, bit 2
- is the high bits pad type, and bit 3 is the internal bits
- pad type. If a datum has unused bits at either end or between
- the sign bit, exponent, or mantissa, then the value of bit
- 1, 2, or 3 is copied to those locations.</p></td>
- </tr>
-
- <tr>
- <td><p>4-5</p></td>
- <td><p><b>Mantissa Normalization.</b> This 2-bit bit field specifies
- how the most significant bit of the mantissa is managed.
+ <tr>
+ <td><p>3</p></td>
+ <td><p>
+ <b>Signed.</b> If this bit is set then the fixed-point number is in
+ 2&rsquo;s complement form.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>4-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fixed-Point Property Description</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="2">Bit Offset</td>
+ <td colspan="2">Bit Precision</td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Bit Offset</p></td>
+ <td>
+ <p>The bit offset of the first significant bit of the
+ fixed-point value within the datatype. The bit offset specifies the
+ number of bits &ldquo;to the right of&rdquo; the value (which are
+ set to the lo_pad bit value).</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Bit Precision</p></td>
+ <td>
+ <p>The number of bits of precision of the fixed-point value
+ within the datatype. This value, combined with the datatype
+ element&rsquo;s size and the Bit Offset field specifies the number
+ of bits &ldquo;to the left of&rdquo; the value (which are set to
+ the hi_pad bit value).</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+
+<br />
+<p>Class specific information for Floating-Point Numbers (Class 1):</p>
+
+<div align="center">
+ <table class="desc">
+ <caption>Floating-Point Bit Field Description</caption>
+
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
+
+ <tr>
+ <td><p>0, 6</p></td>
+ <td><p>
+ <b>Byte Order.</b> These two non-contiguous bits specify the
+ &ldquo;endianness&rdquo; of the bytes in the datatype element.
+ </p>
<table class="list">
<tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
+ <th width="10%" align="center">Bit 6</th>
+ <th width="10%" align="center">Bit 0</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>No normalization
- </td>
+ <td align="center"><code>0</code></td>
+ <td align="center"><code>0</code></td>
+ <td>Byte order is little-endian</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>The most significant bit of the mantissa is always set
- (except for 0.0).
- </td>
+ <td align="center"><code>0</code></td>
+ <td align="center"><code>1</code></td>
+ <td>Byte order is big-endian</td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>The most significant bit of the mantissa is not stored,
- but is implied to be set.
- </td>
+ <td align="center"><code>1</code></td>
+ <td align="center"><code>0</code></td>
+ <td>Reserved</td>
</tr>
<tr>
- <td align="center"><code>3</code></td>
- <td>Reserved.
- </td>
+ <td align="center"><code>1</code></td>
+ <td align="center"><code>1</code></td>
+ <td>Byte order is VAX-endian</td>
</tr>
- </table></p>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>1, 2, 3</p></td>
+ <td><p>
+ <b>Padding type.</b> Bit 1 is the low bits pad type, bit 2 is the
+ high bits pad type, and bit 3 is the internal bits pad type. If a
+ datum has unused bits at either end or between the sign bit,
+ exponent, or mantissa, then the value of bit 1, 2, or 3 is copied
+ to those locations.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>4-5</p></td>
+ <td><p>
+ <b>Mantissa Normalization.</b> This 2-bit bit field specifies how
+ the most significant bit of the mantissa is managed.
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>No normalization</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>The most significant bit of the mantissa is always set
+ (except for 0.0).</td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>The most significant bit of the mantissa is not stored,
+ but is implied to be set.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>Reserved.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>7</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+
+ <tr>
+ <td><p>8-15</p></td>
+ <td><p>
+ <b>Sign Location.</b> This is the bit position of the sign bit.
+ Bits are numbered with the least significant bit zero.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>16-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Floating-Point Property Description</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="2">Bit Offset</td>
+ <td colspan="2">Bit Precision</td>
+ </tr>
+
+ <tr>
+ <td>Exponent Location</td>
+ <td>Exponent Size</td>
+ <td>Mantissa Location</td>
+ <td>Mantissa Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Exponent Bias</td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Bit Offset</p></td>
+ <td>
+ <p>The bit offset of the first significant bit of the
+ floating-point value within the datatype. The bit offset specifies
+ the number of bits &ldquo;to the right of&rdquo; the value.</p>
</td>
- </tr>
+ </tr>
- <tr>
- <td><p>7</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
+ <tr>
+ <td><p>Bit Precision</p></td>
+ <td>
+ <p>The number of bits of precision of the floating-point value
+ within the datatype.</p>
+ </td>
+ </tr>
- <tr>
- <td><p>8-15</p></td>
- <td><p><b>Sign Location.</b> This is the bit position of the sign
- bit. Bits are numbered with the least significant bit zero.</p></td>
- </tr>
+ <tr>
+ <td><p>Exponent Location</p></td>
+ <td>
+ <p>The bit position of the exponent field. Bits are numbered
+ with the least significant bit number zero.</p>
+ </td>
+ </tr>
- <tr>
- <td><p>16-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
+ <tr>
+ <td><p>Exponent Size</p></td>
+ <td>
+ <p>The size of the exponent field in bits.</p>
+ </td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Mantissa Location</p></td>
+ <td>
+ <p>The bit position of the mantissa field. Bits are numbered
+ with the least significant bit number zero.</p>
+ </td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Floating-Point Property Description
- </caption>
-
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
-
- <tr>
- <td colspan="2">Bit Offset</td>
- <td colspan="2">Bit Precision</td>
- </tr>
-
- <tr>
- <td>Exponent Location</td>
- <td>Exponent Size</td>
- <td>Mantissa Location</td>
- <td>Mantissa Size</td>
- </tr>
-
- <tr>
- <td colspan="4">Exponent Bias</td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Mantissa Size</p></td>
+ <td>
+ <p>The size of the mantissa field in bits.</p>
+ </td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Bit Offset</p></td>
- <td>
- <p>The bit offset of the first significant bit of the floating-point
- value within the datatype. The bit offset specifies the number
- of bits &ldquo;to the right of&rdquo; the value.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Bit Precision</p></td>
- <td>
- <p>The number of bits of precision of the floating-point value
- within the datatype.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Exponent Location</p></td>
- <td>
- <p>The bit position of the exponent field. Bits are numbered with
- the least significant bit number zero.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Exponent Size</p></td>
- <td>
- <p>The size of the exponent field in bits.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Mantissa Location</p></td>
- <td>
- <p>The bit position of the mantissa field. Bits are numbered with
- the least significant bit number zero.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Mantissa Size</p></td>
- <td>
- <p>The size of the mantissa field in bits.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Exponent Bias</p></td>
- <td>
- <p>The bias of the exponent field.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>Exponent Bias</p></td>
+ <td>
+ <p>The bias of the exponent field.</p>
+ </td>
+ </tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>Class specific information for Time (Class 2):</p>
-
-
- <div align="center">
- <table class="desc">
- <caption>
- Time Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0</p></td>
- <td><p><b>Byte Order.</b> If zero, byte order is little-endian;
- otherwise, byte order is big endian.</p></td>
- </tr>
-
- <tr>
- <td><p>1-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+<br />
+<p>Class specific information for Time (Class 2):</p>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Time Property Description
- </caption>
-
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
-
- <tr>
- <td colspan="2">Bit Precision</td>
- </tr>
- </table>
- </div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Bit Precision</p></td>
- <td>
- <p>The number of bits of precision of the time value.
- </p>
- </td>
- </tr>
+<div align="center">
+ <table class="desc">
+ <caption>Time Bit Field Description</caption>
- </table>
- </div>
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
+ <tr>
+ <td><p>0</p></td>
+ <td><p>
+ <b>Byte Order.</b> If zero, byte order is little-endian; otherwise,
+ byte order is big endian.
+ </p></td>
+ </tr>
- <br />
- <p>Class specific information for Strings (Class 3):</p>
-
-
- <div align="center">
- <table class="desc">
- <caption>
- String Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0-3</p></td>
- <td><p><b>Padding type.</b> This four-bit value determines the
- type of padding to use for the string. The values are:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Null Terminate: A zero byte marks the end of the
- string and is guaranteed to be present after
- converting a long string to a short string. When
- converting a short string to a long string the value is
- padded with additional null characters as necessary.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Null Pad: Null characters are added to the end of
- the value during conversions from short values to long
- values but conversion in the opposite direction simply
- truncates the value.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Space Pad: Space characters are added to the end of
- the value during conversions from short values to long
- values but conversion in the opposite direction simply
- truncates the value. This is the Fortran
- representation of the string.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>3-15</code></td>
- <td>Reserved
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>4-7</p></td>
- <td><p><b>Character Set.</b> The character set used to
- encode the string.
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>ASCII character set encoding
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>UTF-8 character set encoding
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2-15</code></td>
- <td>Reserved
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>8-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
-
- <p>There are no properties defined for the string class.
- </p>
-
-
- <p>Class specific information for bit fields (Class 4):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Bitfield Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0</p></td>
- <td><p><b>Byte Order.</b> If zero, byte order is little-endian;
- otherwise, byte order is big endian.</p></td>
- </tr>
-
- <tr>
- <td><p>1, 2</p></td>
- <td><p><b>Padding type.</b> Bit 1 is the lo_pad type and bit 2
- is the hi_pad type. If a datum has unused bits at either
- end, then the lo_pad or hi_pad bit is copied to those
- locations.</p></td>
- </tr>
-
- <tr>
- <td><p>3-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>1-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Bit Field Property Description
- </caption>
-
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
-
- <tr>
- <td colspan="2">Bit Offset</td>
- <td colspan="2">Bit Precision</td>
- </tr>
- </table>
- </div>
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Time Property Description</caption>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Bit Offset</p></td>
- <td>
- <p>The bit offset of the first significant bit of the bit field
- within the datatype. The bit offset specifies the number
- of bits &ldquo;to the right of&rdquo; the value.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Bit Precision</p></td>
- <td>
- <p>The number of bits of precision of the bit field
- within the datatype.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+ <tr>
+ <td colspan="2">Bit Precision</td>
+ </tr>
+ </table>
+</div>
- <br />
- <p>Class specific information for Opaque (Class 5):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Opaque Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0-7</p></td>
- <td><p>Length of ASCII tag in bytes.</p></td>
- </tr>
-
- <tr>
- <td><p>8-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Opaque Property Description
- </caption>
-
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />ASCII Tag<br />
- <br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Bit Precision</p></td>
+ <td>
+ <p>The number of bits of precision of the time value.</p>
+ </td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>ASCII Tag</p></td>
- <td>
- <p>This NUL-terminated string provides a description for the
- opaque type. It is NUL-padded to a multiple of 8 bytes.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <p>Class specific information for Compound (Class 6):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Compound Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0-15</p></td>
- <td><p><b>Number of Members.</b> This field contains the number
- of members defined for the compound datatype. The member
- definitions are listed in the Properties field of the data
- type message.</p></td>
- </tr>
-
- <tr>
- <td><p>16-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+<br />
+<p>Class specific information for Strings (Class 3):</p>
- <p>The Properties field of a compound datatype is a list of the
- member definitions of the compound datatype. The member
- definitions appear one after another with no intervening bytes.
- The member types are described with a (recursively) encoded datatype
- message.</p>
+<div align="center">
+ <table class="desc">
+ <caption>String Bit Field Description</caption>
- <p>Note that the property descriptions are different for different
- versions of the datatype version. Additionally note that the version
- 0 datatype encoding is deprecated and has been replaced with later
- encodings in versions of the HDF5 Library from the 1.4 release
- onward.</p>
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
+ <tr>
+ <td><p>0-3</p></td>
+ <td><p>
+ <b>Padding type.</b> This four-bit value determines the type of
+ padding to use for the string. The values are:
- <div align="center">
- <table class="format">
- <caption>
- Compound Properties Description for Datatype Version 1
- </caption>
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Null Terminate: A zero byte marks the end of the string
+ and is guaranteed to be present after converting a long string to
+ a short string. When converting a short string to a long string
+ the value is padded with additional null characters as necessary.
+ </td>
+ </tr>
- <tr>
- <td colspan="4"><br />Name<br /><br /></td>
- </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Null Pad: Null characters are added to the end of the
+ value during conversions from short values to long values but
+ conversion in the opposite direction simply truncates the value.
+ </td>
+ </tr>
- <tr>
- <td colspan="4">Byte Offset of Member</td>
- </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Space Pad: Space characters are added to the end of the
+ value during conversions from short values to long values but
+ conversion in the opposite direction simply truncates the value.
+ This is the Fortran representation of the string.</td>
+ </tr>
- <tr>
- <td>Dimensionality</td>
- <td colspan="3">Reserved (zero)</td>
- </tr>
+ <tr>
+ <td align="center"><code>3-15</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
- <tr>
- <td colspan="4">Dimension Permutation</td>
- </tr>
+ <tr>
+ <td><p>4-7</p></td>
+ <td><p>
+ <b>Character Set.</b> The character set used to encode the string.
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <tr>
- <td colspan="4">Reserved (zero)</td>
- </tr>
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>ASCII character set encoding</td>
+ </tr>
- <tr>
- <td colspan="4">Dimension #1 Size (required)</td>
- </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>UTF-8 character set encoding</td>
+ </tr>
- <tr>
- <td colspan="4">Dimension #2 Size (required)</td>
- </tr>
+ <tr>
+ <td align="center"><code>2-15</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
- <tr>
- <td colspan="4">Dimension #3 Size (required)</td>
- </tr>
+ <tr>
+ <td><p>8-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
- <tr>
- <td colspan="4">Dimension #4 Size (required)</td>
- </tr>
+<p>There are no properties defined for the string class.</p>
- <tr>
- <td colspan="4"><br />Member Type Message<br /><br /></td>
- </tr>
- </table>
- </div>
+<p>Class specific information for bit fields (Class 4):</p>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td>
- <p>This NUL-terminated string provides a description for the
- opaque type. It is NUL-padded to a multiple of 8 bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Byte Offset of Member</p></td>
- <td>
- <p>This is the byte offset of the member within the datatype.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimensionality</p></td>
- <td>
- <p>If set to zero, this field indicates a scalar member. If set
- to a value greater than zero, this field indicates that the
- member is an array of values. For array members, the size of
- the array is indicated by the &lsquo;Size of Dimension n&rsquo; field in
- this message.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension Permutation</p></td>
- <td>
- <p>This field was intended to allow an array field to have
- its dimensions permuted, but this was never implemented.
- This field should always be set to zero.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Size</p></td>
- <td>
- <p>This field is the size of a dimension of the array field as
- stored in the file. The first dimension stored in the list of
- dimensions is the slowest changing dimension and the last
- dimension stored is the fastest changing dimension.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Member Type Message</p></td>
- <td>
- <p>This field is a datatype message describing the datatype of
- the member.
- </p>
- </td>
- </tr>
+<div align="center">
+ <table class="desc">
+ <caption>Bitfield Bit Field Description</caption>
- </table>
- </div>
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Compound Properties Description for Datatype Version 2
- </caption>
-
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Byte Offset of Member</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Member Type Message<br /><br /></td>
- </tr>
+ <tr>
+ <td><p>0</p></td>
+ <td><p>
+ <b>Byte Order.</b> If zero, byte order is little-endian; otherwise,
+ byte order is big endian.
+ </p></td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>1, 2</p></td>
+ <td><p>
+ <b>Padding type.</b> Bit 1 is the lo_pad type and bit 2 is the
+ hi_pad type. If a datum has unused bits at either end, then the
+ lo_pad or hi_pad bit is copied to those locations.
+ </p></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td>
- <p>This NUL-terminated string provides a description for the
- opaque type. It is NUL-padded to a multiple of 8 bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Byte Offset of Member</p></td>
- <td>
- <p>This is the byte offset of the member within the datatype.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Member Type Message</p></td>
- <td>
- <p>This field is a datatype message describing the datatype of
- the member.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>3-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
- </table>
- </div>
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Bit Field Property Description</caption>
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Compound Properties Description for Datatype Version 3
- </caption>
-
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Byte Offset of Member <em>(variable size)</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Member Type Message<br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="2">Bit Offset</td>
+ <td colspan="2">Bit Precision</td>
+ </tr>
+ </table>
+</div>
- </table>
- </div>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td><p>This NUL-terminated string provides a description for the
- opaque type. It is <em>not</em> NUL-padded to a multiple of 8
- bytes.</p></td>
- </tr>
-
- <tr>
- <td><p>Byte Offset of Member</p></td>
- <td><p>This is the byte offset of the member within the datatype.
- The field size is the minimum number of bytes necessary,
- based on the size of the datatype element. For example, a
- datatype element size of less than 256 bytes uses a 1 byte
- length, a datatype element size of 256-65535 bytes uses a
- 2 byte length, and so on.</p></td>
- </tr>
-
- <tr>
- <td><p>Member Type Message</p></td>
- <td><p>This field is a datatype message describing the datatype of
- the member.</p></td>
- </tr>
+ <tr>
+ <td><p>Bit Offset</p></td>
+ <td>
+ <p>The bit offset of the first significant bit of the bit field
+ within the datatype. The bit offset specifies the number of bits
+ &ldquo;to the right of&rdquo; the value.</p>
+ </td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Bit Precision</p></td>
+ <td>
+ <p>The number of bits of precision of the bit field within the
+ datatype.</p>
+ </td>
+ </tr>
+ </table>
+</div>
- <br />
- <p>Class specific information for Reference (Class 7):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Reference Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0-3</p></td>
- <td><p><b>Type.</b> This four-bit value contains the type of reference
- described. The values defined are:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Object Reference: A reference to another object in this
- HDF5 file.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Dataset Region Reference: A reference to a region within
- a dataset in this HDF5 file.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2-15</code></td>
- <td>Reserved
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>4-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+<br />
+<p>Class specific information for Opaque (Class 5):</p>
- <p>There are no properties defined for the reference class.
- </p>
+<div align="center">
+ <table class="desc">
+ <caption>Opaque Bit Field Description</caption>
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
- <br />
- <p>Class specific information for Enumeration (Class 8):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Enumeration Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0-15</p></td>
- <td><p><b>Number of Members.</b> The number of name/value
- pairs defined for the enumeration type.</p></td>
- </tr>
-
- <tr>
- <td><p>16-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>0-7</p></td>
+ <td><p>Length of ASCII tag in bytes.</p></td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Enumeration Property Description for Datatype Versions 1 & 2
- </caption>
+ <tr>
+ <td><p>8-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Opaque Property Description</caption>
- <tr>
- <td colspan="4"><br />Base Type<br /><br /></td>
- </tr>
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
- <tr>
- <td colspan="4"><br />Names<br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />ASCII Tag<br /> <br /></td>
+ </tr>
+ </table>
+</div>
- <tr>
- <td colspan="4"><br />Values<br /><br /></td>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
- </table>
- </div>
+ <tr>
+ <td><p>ASCII Tag</p></td>
+ <td>
+ <p>This NUL-terminated string provides a description for the
+ opaque type. It is NUL-padded to a multiple of 8 bytes.</p>
+ </td>
+ </tr>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Base Type</p></td>
- <td>
- <p>Each enumeration type is based on some parent type, usually an
- integer. The information for that parent type is described
- recursively by this field.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Names</p></td>
- <td>
- <p>The name for each name/value pair. Each name is stored as a null
- terminated ASCII string in a multiple of eight bytes. The names
- are in no particular order.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Values</p></td>
- <td>
- <p>The list of values in the same order as the names. The values
- are packed (no inter-value padding) and the size of each value
- is determined by the parent type.
- </p>
- </td>
- </tr>
- </table>
- </div>
+<br />
+<p>Class specific information for Compound (Class 6):</p>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Enumeration Property Description for Datatype Version 3
- </caption>
+<div align="center">
+ <table class="desc">
+ <caption>Compound Bit Field Description</caption>
+
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
+
+ <tr>
+ <td><p>0-15</p></td>
+ <td><p>
+ <b>Number of Members.</b> This field contains the number of members
+ defined for the compound datatype. The member definitions are
+ listed in the Properties field of the data type message.
+ </p></td>
+ </tr>
- <tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- </tr>
+ <tr>
+ <td><p>16-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
+
+
+<p>The Properties field of a compound datatype is a list of the
+ member definitions of the compound datatype. The member definitions
+ appear one after another with no intervening bytes. The member types
+ are described with a (recursively) encoded datatype message.</p>
- <tr>
- <td colspan="4"><br />Base Type<br /><br /></td>
- </tr>
+<p>Note that the property descriptions are different for different
+ versions of the datatype version. Additionally note that the version 0
+ datatype encoding is deprecated and has been replaced with later
+ encodings in versions of the HDF5 Library from the 1.4 release onward.</p>
- <tr>
- <td colspan="4"><br />Names<br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Values<br /><br /></td>
+<div align="center">
+ <table class="format">
+ <caption>Compound Properties Description for Datatype
+ Version 1</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
</tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Name<br />
+ <br /></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Base Type</p></td>
- <td>
- <p>Each enumeration type is based on some parent type, usually an
- integer. The information for that parent type is described
- recursively by this field.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Names</p></td>
- <td>
- <p>The name for each name/value pair. Each name is stored as a null
- terminated ASCII string, <em>not</em> padded to a multiple of
- eight bytes. The names are in no particular order.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Values</p></td>
- <td>
- <p>The list of values in the same order as the names. The values
- are packed (no inter-value padding) and the size of each value
- is determined by the parent type.
- </p>
- </td>
- </tr>
+ <tr>
+ <td colspan="4">Byte Offset of Member</td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td>Dimensionality</td>
+ <td colspan="3">Reserved (zero)</td>
+ </tr>
+ <tr>
+ <td colspan="4">Dimension Permutation</td>
+ </tr>
+ <tr>
+ <td colspan="4">Reserved (zero)</td>
+ </tr>
- <br />
- <p>Class specific information for Variable-Length (Class 9):</p>
-
- <div align="center">
- <table class="desc">
- <caption>
- Variable-Length Bit Field Description
- </caption>
-
- <tr>
- <th width="10%">Bits</th>
- <th>Meaning</th>
- </tr>
-
- <tr>
- <td><p>0-3</p></td>
- <td><p><b>Type.</b> This four-bit value contains the type of
- variable-length datatype described. The values defined are:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Sequence: A variable-length sequence of any datatype.
- Variable-length sequences do not have padding or
- character set information.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>String: A variable-length sequence of characters.
- Variable-length strings have padding and character set
- information.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2-15</code></td>
- <td>Reserved
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>4-7</p></td>
- <td><p><b>Padding type.</b> (variable-length string only)
- This four-bit value determines the type of padding
- used for variable-length strings. The values are the same
- as for the string padding type, as follows:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Null terminate: A zero byte marks the end of a string
- and is guaranteed to be present after converting a long
- string to a short string. When converting a short string
- to a long string, the value is padded with additional null
- characters as necessary.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Null pad: Null characters are added to the end of the
- value during conversion from a short string to a longer
- string. Conversion from a long string to a shorter string
- simply truncates the value.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Space pad: Space characters are added to the end of the
- value during conversion from a short string to a longer
- string. Conversion from a long string to a shorter string
- simply truncates the value. This is the Fortran
- representation of the string.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>3-15</code></td>
- <td>Reserved
- </td>
- </tr>
- </table></p>
-
- <p>This value is set to zero for variable-length sequences.</p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>8-11</p></td>
- <td><p><b>Character Set.</b> (variable-length string only)
- This four-bit value specifies the character set
- to be used for encoding the string:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>ASCII character set encoding
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>UTF-8 character set encoding
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2-15</code></td>
- <td>Reserved
- </td>
- </tr>
- </table></p>
-
- <p>This value is set to zero for variable-length sequences.</p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>12-23</p></td>
- <td><p>Reserved (zero).</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">Dimension #1 Size (required)</td>
+ </tr>
- <br />
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Variable-Length Property Description
- </caption>
+ <tr>
+ <td colspan="4">Dimension #2 Size (required)</td>
+ </tr>
<tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
+ <td colspan="4">Dimension #3 Size (required)</td>
</tr>
<tr>
- <td colspan="4"><br />Base Type<br /><br /></td>
+ <td colspan="4">Dimension #4 Size (required)</td>
</tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Member Type Message<br />
+ <br /></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="10%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Base Type</p></td>
- <td>
- <p>Each variable-length type is based on some parent type. The
- information for that parent type is described recursively by
- this field.
- </p>
- </td>
- </tr>
+ </table>
+</div>
- </table>
- </div>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Name</p></td>
+ <td>
+ <p>This NUL-terminated string provides a description for the
+ opaque type. It is NUL-padded to a multiple of 8 bytes.</p>
+ </td>
+ </tr>
+ <tr>
+ <td><p>Byte Offset of Member</p></td>
+ <td>
+ <p>This is the byte offset of the member within the datatype.</p>
+ </td>
+ </tr>
- <br />
- <p>Class specific information for Array (Class 10):</p>
+ <tr>
+ <td><p>Dimensionality</p></td>
+ <td>
+ <p>If set to zero, this field indicates a scalar member. If set
+ to a value greater than zero, this field indicates that the member
+ is an array of values. For array members, the size of the array is
+ indicated by the &lsquo;Size of Dimension n&rsquo; field in this
+ message.</p>
+ </td>
+ </tr>
- <p>There are no bit fields defined for the array class.
- </p>
+ <tr>
+ <td><p>Dimension Permutation</p></td>
+ <td>
+ <p>This field was intended to allow an array field to have its
+ dimensions permuted, but this was never implemented. This field
+ should always be set to zero.</p>
+ </td>
+ </tr>
- <p>Note that the dimension information defined in the property for this
- datatype class is independent of dataspace information for a dataset.
- The dimension information here describes the dimensionality of the
- information within a data element (or a component of an element, if the
- array datatype is nested within another datatype) and the dataspace for a
- dataset describes the size and locations of the elements in a dataset.
- </p>
+ <tr>
+ <td><p>Dimension #n Size</p></td>
+ <td>
+ <p>This field is the size of a dimension of the array field as
+ stored in the file. The first dimension stored in the list of
+ dimensions is the slowest changing dimension and the last dimension
+ stored is the fastest changing dimension.</p>
+ </td>
+ </tr>
+ <tr>
+ <td><p>Member Type Message</p></td>
+ <td>
+ <p>This field is a datatype message describing the datatype of
+ the member.</p>
+ </td>
+ </tr>
- <div align="center">
- <table class="format">
- <caption>
- Array Property Description for Datatype Version 2
- </caption>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Compound Properties Description for Datatype
+ Version 2</caption>
<tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
</tr>
- <tr>
- <td>Dimensionality</td>
- <td colspan="3">Reserved (zero)</td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Name<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Byte Offset of Member</td>
+ </tr>
- <tr>
- <td colspan="4">Dimension #1 Size</td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4">Dimension #n Size</td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Member Type Message<br />
+ <br /></td>
+ </tr>
- <tr>
- <td colspan="4">Permutation Index #1</td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4">Permutation Index #n</td>
- </tr>
+ </table>
+</div>
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <td colspan="4"><br />Base Type<br /><br /></td>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
- </table>
- </div>
+ <tr>
+ <td><p>Name</p></td>
+ <td>
+ <p>This NUL-terminated string provides a description for the
+ opaque type. It is NUL-padded to a multiple of 8 bytes.</p>
+ </td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Dimensionality</p></td>
- <td>
- <p>This value is the number of dimensions that the array has.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Size</p></td>
- <td>
- <p>This value is the size of the dimension of the array
- as stored in the file. The first dimension stored in
- the list of dimensions is the slowest changing dimension
- and the last dimension stored is the fastest changing
- dimension.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Permutation Index #n</p></td>
- <td>
- <p>This value is the index permutation used to map
- each dimension from the canonical representation to an
- alternate axis for each dimension. Currently, dimension
- permutations are not supported, and these indices should
- be set to the index position minus one. In other words,
- the first dimension should be set to 0, the second dimension
- should be set to 1, and so on.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Base Type</p></td>
- <td>
- <p>Each array type is based on some parent type. The
- information for that parent type is described recursively by
- this field.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>Byte Offset of Member</p></td>
+ <td>
+ <p>This is the byte offset of the member within the datatype.</p>
+ </td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Member Type Message</p></td>
+ <td>
+ <p>This field is a datatype message describing the datatype of
+ the member.</p>
+ </td>
+ </tr>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Array Property Description for Datatype Version 3
- </caption>
+ </table>
+</div>
+
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Compound Properties Description for Datatype
+ Version 3</caption>
<tr>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
- <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
</tr>
- <tr>
- <td>Dimensionality</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Name<br />
+ <br /></td>
+ </tr>
- <tr>
- <td colspan="4">Dimension #1 Size</td>
- </tr>
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
- <tr>
- <td colspan="4">Dimension #n Size</td>
- </tr>
+ <tr>
+ <td colspan="4">Byte Offset of Member <em>(variable size)</em></td>
+ </tr>
<tr>
- <td colspan="4"><br />Base Type<br /><br /></td>
+ <td colspan="4"><br />Member Type Message<br />
+ <br /></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Dimensionality</p></td>
- <td>
- <p>This value is the number of dimensions that the array has.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Size</p></td>
- <td>
- <p>This value is the size of the dimension of the array
- as stored in the file. The first dimension stored in
- the list of dimensions is the slowest changing dimension
- and the last dimension stored is the fastest changing
- dimension.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Base Type</p></td>
- <td>
- <p>Each array type is based on some parent type. The
- information for that parent type is described recursively by
- this field.
- </p>
- </td>
- </tr>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Name</p></td>
+ <td><p>
+ This NUL-terminated string provides a description for the opaque
+ type. It is <em>not</em> NUL-padded to a multiple of 8 bytes.
+ </p></td>
+ </tr>
+ <tr>
+ <td><p>Byte Offset of Member</p></td>
+ <td><p>This is the byte offset of the member within the
+ datatype. The field size is the minimum number of bytes necessary,
+ based on the size of the datatype element. For example, a datatype
+ element size of less than 256 bytes uses a 1 byte length, a
+ datatype element size of 256-65535 bytes uses a 2 byte length, and
+ so on.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Member Type Message</p></td>
+ <td><p>This field is a datatype message describing the
+ datatype of the member.</p></td>
+ </tr>
+
+ </table>
+</div>
<br />
-<h4><a name="OldFillValueMessage">IV.A.2.e. The Data Storage -
-Fill Value (Old) Message</a></h4>
+<p>Class specific information for Reference (Class 7):</p>
- <!-- start msgdesc table -->
- <center>
+<div align="center">
+ <table class="desc">
+ <caption>Reference Bit Field Description</caption>
+
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
+
+ <tr>
+ <td><p>0-3</p></td>
+ <td><p>
+ <b>Type.</b> This four-bit value contains the type of reference
+ described. The values defined are:
+
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Object Reference: A reference to another object in this
+ HDF5 file.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Dataset Region Reference: A reference to a region within
+ a dataset in this HDF5 file.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2-15</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>4-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
+
+<p>There are no properties defined for the reference class.</p>
+
+
+<br />
+<p>Class specific information for Enumeration (Class 8):</p>
+
+<div align="center">
+ <table class="desc">
+ <caption>Enumeration Bit Field Description</caption>
+
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
+
+ <tr>
+ <td><p>0-15</p></td>
+ <td><p>
+ <b>Number of Members.</b> The number of name/value pairs defined
+ for the enumeration type.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>16-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Enumeration Property Description for Datatype
+ Versions 1 & 2</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Base Type<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Names<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Values<br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Base Type</p></td>
+ <td>
+ <p>Each enumeration type is based on some parent type, usually
+ an integer. The information for that parent type is described
+ recursively by this field.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Names</p></td>
+ <td>
+ <p>The name for each name/value pair. Each name is stored as a
+ null terminated ASCII string in a multiple of eight bytes. The
+ names are in no particular order.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Values</p></td>
+ <td>
+ <p>The list of values in the same order as the names. The values
+ are packed (no inter-value padding) and the size of each value is
+ determined by the parent type.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Enumeration Property Description for Datatype
+ Version 3</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Base Type<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Names<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Values<br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Base Type</p></td>
+ <td>
+ <p>Each enumeration type is based on some parent type, usually
+ an integer. The information for that parent type is described
+ recursively by this field.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Names</p></td>
+ <td>
+ <p>
+ The name for each name/value pair. Each name is stored as a null
+ terminated ASCII string, <em>not</em> padded to a multiple of eight
+ bytes. The names are in no particular order.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Values</p></td>
+ <td>
+ <p>The list of values in the same order as the names. The values
+ are packed (no inter-value padding) and the size of each value is
+ determined by the parent type.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+
+
+<br />
+<p>Class specific information for Variable-Length (Class 9):</p>
+
+<div align="center">
+ <table class="desc">
+ <caption>Variable-Length Bit Field Description</caption>
+
+ <tr>
+ <th width="10%">Bits</th>
+ <th>Meaning</th>
+ </tr>
+
+ <tr>
+ <td><p>0-3</p></td>
+ <td><p>
+ <b>Type.</b> This four-bit value contains the type of
+ variable-length datatype described. The values defined are:
+
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Sequence: A variable-length sequence of any datatype.
+ Variable-length sequences do not have padding or character set
+ information.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>String: A variable-length sequence of characters.
+ Variable-length strings have padding and character set
+ information.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2-15</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>4-7</p></td>
+ <td><p>
+ <b>Padding type.</b> (variable-length string only) This four-bit
+ value determines the type of padding used for variable-length
+ strings. The values are the same as for the string padding type, as
+ follows:
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Null terminate: A zero byte marks the end of a string and
+ is guaranteed to be present after converting a long string to a
+ short string. When converting a short string to a long string,
+ the value is padded with additional null characters as necessary.
+ </td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Null pad: Null characters are added to the end of the
+ value during conversion from a short string to a longer string.
+ Conversion from a long string to a shorter string simply
+ truncates the value.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Space pad: Space characters are added to the end of the
+ value during conversion from a short string to a longer string.
+ Conversion from a long string to a shorter string simply
+ truncates the value. This is the Fortran representation of the
+ string.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3-15</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p>
+
+ <p>This value is set to zero for variable-length sequences.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>8-11</p></td>
+ <td><p>
+ <b>Character Set.</b> (variable-length string only) This four-bit
+ value specifies the character set to be used for encoding the
+ string:
+ </p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>ASCII character set encoding</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>UTF-8 character set encoding</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2-15</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p>
+
+ <p>This value is set to zero for variable-length sequences.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>12-23</p></td>
+ <td><p>Reserved (zero).</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Variable-Length Property Description</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Base Type<br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="10%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Base Type</p></td>
+ <td>
+ <p>Each variable-length type is based on some parent type. The
+ information for that parent type is described recursively by this
+ field.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+
+<br />
+<p>Class specific information for Array (Class 10):</p>
+
+<p>There are no bit fields defined for the array class.</p>
+
+<p>Note that the dimension information defined in the property for
+ this datatype class is independent of dataspace information for a
+ dataset. The dimension information here describes the dimensionality of
+ the information within a data element (or a component of an element, if
+ the array datatype is nested within another datatype) and the dataspace
+ for a dataset describes the size and locations of the elements in a
+ dataset.</p>
+
+
+<div align="center">
+ <table class="format">
+ <caption>Array Property Description for Datatype Version 2</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+
+ <tr>
+ <td>Dimensionality</td>
+ <td colspan="3">Reserved (zero)</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Dimension #1 Size</td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">Dimension #n Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Permutation Index #1</td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">Permutation Index #n</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Base Type<br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Dimensionality</p></td>
+ <td>
+ <p>This value is the number of dimensions that the array has.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Size</p></td>
+ <td>
+ <p>This value is the size of the dimension of the array as
+ stored in the file. The first dimension stored in the list of
+ dimensions is the slowest changing dimension and the last dimension
+ stored is the fastest changing dimension.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Permutation Index #n</p></td>
+ <td>
+ <p>This value is the index permutation used to map each
+ dimension from the canonical representation to an alternate axis
+ for each dimension. Currently, dimension permutations are not
+ supported, and these indices should be set to the index position
+ minus one. In other words, the first dimension should be set to 0,
+ the second dimension should be set to 1, and so on.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Base Type</p></td>
+ <td>
+ <p>Each array type is based on some parent type. The information
+ for that parent type is described recursively by this field.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Array Property Description for Datatype Version 3</caption>
+
+ <tr>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ <th width="25%">Byte</th>
+ </tr>
+
+ <tr>
+ <td>Dimensionality</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Dimension #1 Size</td>
+ </tr>
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+ <tr>
+ <td colspan="4">Dimension #n Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Base Type<br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Dimensionality</p></td>
+ <td>
+ <p>This value is the number of dimensions that the array has.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Size</p></td>
+ <td>
+ <p>This value is the size of the dimension of the array as
+ stored in the file. The first dimension stored in the list of
+ dimensions is the slowest changing dimension and the last dimension
+ stored is the fastest changing dimension.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Base Type</p></td>
+ <td>
+ <p>Each array type is based on some parent type. The information
+ for that parent type is described recursively by this field.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+
+
+<br />
+<h4>
+ <a name="OldFillValueMessage">IV.A.2.e. The Data Storage - Fill
+ Value (Old) Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Fill Value
- (old)</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0004</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td><p>The fill value message stores a single data value which
- is returned to the application when an uninitialized data element
- is read from a dataset. The fill value is interpreted with the
- same datatype as the dataset. If no fill value message is present
- then a fill value of all zero bytes is assumed.</p>
- <p>This fill value message is deprecated in favor of the
- &ldquo;new&rdquo; fill value message (Message Type 0x0005) and
- is only written to the file for forward compatibility with
- versions of the HDF5 Library before the 1.6.0 version.
- Additionally, it only appears for datasets with a user-defined
- fill value (as opposed to the library default fill value or an
- explicitly set &ldquo;undefined&rdquo; fill value).</p>
- </td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Fill Value Message (Old)
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="4">Size</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Fill Value (old)</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0004</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td><p>The fill value message stores a single data value
+ which is returned to the application when an uninitialized data
+ element is read from a dataset. The fill value is interpreted with
+ the same datatype as the dataset. If no fill value message is
+ present then a fill value of all zero bytes is assumed.</p>
+ <p>This fill value message is deprecated in favor of the
+ &ldquo;new&rdquo; fill value message (Message Type 0x0005) and is
+ only written to the file for forward compatibility with versions of
+ the HDF5 Library before the 1.6.0 version. Additionally, it only
+ appears for datasets with a user-defined fill value (as opposed to
+ the library default fill value or an explicitly set
+ &ldquo;undefined&rdquo; fill value).</p></td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Size</p></td>
- <td>
- <p>This is the size of the Fill Value field in bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Fill Value</p></td>
- <td>
- <p>The fill value. The bytes of the fill value are interpreted
- using the same datatype as for the dataset.
- </p>
- </td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Fill Value Message (Old)</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+ <tr>
+ <td colspan="4">Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Fill Value <em>(optional, variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="FillValueMessage">IV.A.2.f. The Data Storage -
-Fill Value Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Size</p></td>
+ <td>
+ <p>This is the size of the Fill Value field in bytes.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Fill Value</p></td>
+ <td>
+ <p>The fill value. The bytes of the fill value are interpreted
+ using the same datatype as for the dataset.</p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+
+<br />
+<h4>
+ <a name="FillValueMessage">IV.A.2.f. The Data Storage - Fill Value
+ Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Fill
- Value</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0005</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Required for dataset objects;
- may not be repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>The fill value message stores a single data value which is
- returned to the application when an uninitialized data element
- is read from a dataset. The fill value is interpreted with the
- same datatype as the dataset.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Fill Value Message - Versions 1 & 2
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Space Allocation Time</td>
- <td>Fill Value Write Time</td>
- <td>Fill Value Defined</td>
- </tr>
-
- <tr>
- <td colspan="4">Size <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Fill Value</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0005</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Required for dataset objects; may
+ not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The fill value message stores a single data value which is
+ returned to the application when an uninitialized data element is
+ read from a dataset. The fill value is interpreted with the same
+ datatype as the dataset.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number information is used for changes in the
- format of the fill value message and is described here:
+<div align="center">
+ <table class="format">
+ <caption>Fill Value Message - Versions 1 & 2</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Space Allocation Time</td>
+ <td>Fill Value Write Time</td>
+ <td>Fill Value Defined</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Size <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Fill Value <em>(optional, variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number information is used for changes in the
+ format of the fill value message and is described here:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>Never used
- </td>
+ <td align="center"><code>0</code></td>
+ <td>Never used</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>Initial version of this message.
- </td>
+ <td align="center"><code>1</code></td>
+ <td>Initial version of this message.</td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>In this version, the Size and Fill Value fields are
- only present if the Fill Value Defined field is set
- to 1.
- </td>
+ <td align="center"><code>2</code></td>
+ <td>In this version, the Size and Fill Value fields are only
+ present if the Fill Value Defined field is set to 1.</td>
</tr>
<tr>
- <td align="center"><code>3</code></td>
- <td>This version packs the other fields in the message
- more efficiently than version 2.
- </td>
+ <td align="center"><code>3</code></td>
+ <td>This version packs the other fields in the message more
+ efficiently than version 2.</td>
</tr>
- </table></p>
- </p>
- </td>
- </tr>
+ </table>
+ <p></p>
+ <p></p>
+ </td>
+ </tr>
- <tr>
- <td><p>Space Allocation Time</p></td>
- <td>
- <p>When the storage space for the dataset&rsquo;s raw data will be
- allocated. The allowed values are:
+ <tr>
+ <td><p>Space Allocation Time</p></td>
+ <td>
+ <p>When the storage space for the dataset&rsquo;s raw data will
+ be allocated. The allowed values are:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>Not used.
- </td>
+ <td align="center"><code>0</code></td>
+ <td>Not used.</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>Early allocation. Storage space for the entire dataset
- should be allocated in the file when the dataset is
- created.
- </td>
+ <td align="center"><code>1</code></td>
+ <td>Early allocation. Storage space for the entire dataset
+ should be allocated in the file when the dataset is created.</td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>Late allocation. Storage space for the entire dataset
- should not be allocated until the dataset is written
- to.
- </td>
+ <td align="center"><code>2</code></td>
+ <td>Late allocation. Storage space for the entire dataset
+ should not be allocated until the dataset is written to.</td>
</tr>
<tr>
- <td align="center"><code>3</code></td>
- <td>Incremental allocation. Storage space for the
- dataset should not be allocated until the portion
- of the dataset is written to. This is currently
- used in conjunction with chunked data storage for
- datasets.
- </td>
+ <td align="center"><code>3</code></td>
+ <td>Incremental allocation. Storage space for the dataset
+ should not be allocated until the portion of the dataset is
+ written to. This is currently used in conjunction with chunked
+ data storage for datasets.</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- </td>
- </tr>
+ </td>
+ </tr>
- <tr>
- <td><p>Fill Value Write Time</p></td>
- <td>
- <p>At the time that storage space for the dataset&rsquo;s raw data is
- allocated, this value indicates whether the fill value should
- be written to the raw data storage elements. The allowed values
- are:
+ <tr>
+ <td><p>Fill Value Write Time</p></td>
+ <td>
+ <p>At the time that storage space for the dataset&rsquo;s raw
+ data is allocated, this value indicates whether the fill value
+ should be written to the raw data storage elements. The allowed
+ values are:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>On allocation. The fill value is always written to
- the raw data storage when the storage space is allocated.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>Never. The fill value should never be written to
- the raw data storage.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2</code></td>
- <td>Fill value written if set by user. The fill value
- will be written to the raw data storage when the storage
- space is allocated only if the user explicitly set
- the fill value. If the fill value is the library
- default or is undefined, it will not be written to
- the raw data storage.
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Fill Value Defined</p></td>
- <td>
- <p>This value indicates if a fill value is defined for this
- dataset. If this value is 0, the fill value is undefined.
- If this value is 1, a fill value is defined for this dataset.
- For version 2 or later of the fill value message, this value
- controls the presence of the Size and Fill Value fields.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Size</p></td>
- <td>
- <p>This is the size of the Fill Value field in bytes. This field
- is not present if the Version field is greater than 1,
- and the Fill Value Defined field is set to 0.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Fill Value</p></td>
- <td>
- <p>The fill value. The bytes of the fill value are interpreted
- using the same datatype as for the dataset. This field is
- not present if the Version field is greater than 1,
- and the Fill Value Defined field is set to 0.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Fill Value Message - Version 3
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Size <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>On allocation. The fill value is always written to the
+ raw data storage when the storage space is allocated.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Never. The fill value should never be written to the raw
+ data storage.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Fill value written if set by user. The fill value will be
+ written to the raw data storage when the storage space is
+ allocated only if the user explicitly set the fill value. If the
+ fill value is the library default or is undefined, it will not be
+ written to the raw data storage.</td>
+ </tr>
+ </table>
+ <p></p>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number information is used for changes in the
- format of the fill value message and is described here:
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Fill Value Defined</p></td>
+ <td>
+ <p>This value indicates if a fill value is defined for this
+ dataset. If this value is 0, the fill value is undefined. If this
+ value is 1, a fill value is defined for this dataset. For version 2
+ or later of the fill value message, this value controls the
+ presence of the Size and Fill Value fields.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size</p></td>
+ <td>
+ <p>This is the size of the Fill Value field in bytes. This field
+ is not present if the Version field is greater than 1, and the Fill
+ Value Defined field is set to 0.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Fill Value</p></td>
+ <td>
+ <p>The fill value. The bytes of the fill value are interpreted
+ using the same datatype as for the dataset. This field is not
+ present if the Version field is greater than 1, and the Fill Value
+ Defined field is set to 0.</p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Fill Value Message - Version 3</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Size <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Fill Value <em>(optional, variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number information is used for changes in the
+ format of the fill value message and is described here:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0</code></td>
- <td>Never used
- </td>
+ <td align="center"><code>0</code></td>
+ <td>Never used</td>
</tr>
<tr>
- <td align="center"><code>1</code></td>
- <td>Initial version of this message.
- </td>
+ <td align="center"><code>1</code></td>
+ <td>Initial version of this message.</td>
</tr>
<tr>
- <td align="center"><code>2</code></td>
- <td>In this version, the Size and Fill Value fields are
- only present if the Fill Value Defined field is set
- to 1.
- </td>
+ <td align="center"><code>2</code></td>
+ <td>In this version, the Size and Fill Value fields are only
+ present if the Fill Value Defined field is set to 1.</td>
</tr>
<tr>
- <td align="center"><code>3</code></td>
- <td>This version packs the other fields in the message
- more efficiently than version 2.
- </td>
+ <td align="center"><code>3</code></td>
+ <td>This version packs the other fields in the message more
+ efficiently than version 2.</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- </td>
- </tr>
+ </td>
+ </tr>
- <tr>
- <td><p>Flags</p></td>
- <td>
- <p>When the storage space for the dataset&rsquo;s raw data will be
- allocated. The allowed values are:
+ <tr>
+ <td><p>Flags</p></td>
+ <td>
+ <p>When the storage space for the dataset&rsquo;s raw data will
+ be allocated. The allowed values are:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Bits</th>
- <th width="80%" align="left">Description</th>
+ <th width="20%" align="center">Bits</th>
+ <th width="80%" align="left">Description</th>
</tr>
<tr>
- <td align="center"><code>0-1</code></td>
- <td>Space Allocation Time, with the same
- values as versions 1 and 2 of the message.
- </td>
+ <td align="center"><code>0-1</code></td>
+ <td>Space Allocation Time, with the same values as versions 1
+ and 2 of the message.</td>
</tr>
<tr>
- <td align="center"><code>2-3</code></td>
- <td>Fill Value Write Time, with the same
- values as versions 1 and 2 of the message.
- </td>
+ <td align="center"><code>2-3</code></td>
+ <td>Fill Value Write Time, with the same values as versions 1
+ and 2 of the message.</td>
</tr>
<tr>
- <td align="center"><code>4</code></td>
- <td>Fill Value Undefined, indicating that the fill
- value has been marked as &ldquo;undefined&rdquo; for this dataset.
- Bits 4 and 5 cannot both be set.
- </td>
+ <td align="center"><code>4</code></td>
+ <td>Fill Value Undefined, indicating that the fill value has
+ been marked as &ldquo;undefined&rdquo; for this dataset. Bits 4
+ and 5 cannot both be set.</td>
</tr>
<tr>
- <td align="center"><code>5</code></td>
- <td>Fill Value Defined, with the same values as
- versions 1 and 2 of the message.
- Bits 4 and 5 cannot both be set.
- </td>
+ <td align="center"><code>5</code></td>
+ <td>Fill Value Defined, with the same values as versions 1
+ and 2 of the message. Bits 4 and 5 cannot both be set.</td>
</tr>
<tr>
- <td align="center"><code>6-7</code></td>
- <td>Reserved (zero).
- </td>
+ <td align="center"><code>6-7</code></td>
+ <td>Reserved (zero).</td>
</tr>
- </table></p>
+ </table>
+ <p></p>
- </td>
- </tr>
+ </td>
+ </tr>
- <tr>
- <td><p>Size</p></td>
- <td>
- <p>This is the size of the Fill Value field in bytes. This field
- is not present if the Version field is greater than 1,
- and the Fill Value Defined flag is set to 0.
- </p>
- </td>
- </tr>
+ <tr>
+ <td><p>Size</p></td>
+ <td>
+ <p>This is the size of the Fill Value field in bytes. This field
+ is not present if the Version field is greater than 1, and the Fill
+ Value Defined flag is set to 0.</p>
+ </td>
+ </tr>
- <tr>
- <td><p>Fill Value</p></td>
- <td>
- <p>The fill value. The bytes of the fill value are interpreted
- using the same datatype as for the dataset. This field is
- not present if the Version field is greater than 1,
- and the Fill Value Defined flag is set to 0.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Fill Value</p></td>
+ <td>
+ <p>The fill value. The bytes of the fill value are interpreted
+ using the same datatype as for the dataset. This field is not
+ present if the Version field is greater than 1, and the Fill Value
+ Defined flag is set to 0.</p>
+ </td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="LinkMessage">IV.A.2.g. The Link Message</a></h4>
+<h4>
+ <a name="LinkMessage">IV.A.2.g. The Link Message</a>
+</h4>
- <!-- start msgdesc table -->
- <center>
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Link</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0006</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies </td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may be
- repeated. </td></tr>
- <tr><td><b>Description:</b></td>
- <td><p>This message encodes the information for a link in a
- group&rsquo;s object header, when the group is storing its links
- &ldquo;compactly&rdquo;, or in the group&rsquo;s fractal heap,
- when the group is storing its links &ldquo;densely&rdquo;.</p>
- <p>A group is storing its links compactly when the fractal heap
- address in the <em><a href="#LinkInfoMessage">Link Info
- Message</a></em> is set to the &ldquo;undefined address&rdquo;
- value.</p></td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Link Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td>Link type <em>(optional)</em></td>
- <td bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Creation Order <em>(8 bytes, optional)</em><br /><br /></td>
- </tr>
- <tr>
- <td>Link Name Character Set <em>(optional)</em></td>
- <td>Length of Link Name (variable size)</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
- <tr>
- <td colspan="4">Link Name (variable size)</td>
- </tr>
- <tr>
- <td colspan="4"><br />Link Information (variable size)<br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Link</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0006</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td><p>This message encodes the information for a link in a
+ group&rsquo;s object header, when the group is storing its links
+ &ldquo;compactly&rdquo;, or in the group&rsquo;s fractal heap, when
+ the group is storing its links &ldquo;densely&rdquo;.</p>
+ <p>
+ A group is storing its links compactly when the fractal heap
+ address in the <em><a href="#LinkInfoMessage">Link Info
+ Message</a></em> is set to the &ldquo;undefined address&rdquo; value.
+ </p></td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This document describes version 1.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>This field contains information about the link and controls
- the presence of other fields below.
+<div align="center">
+ <table class="format">
+ <caption>Link Message</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td>Link type <em>(optional)</em></td>
+ <td bgcolor="#DDDDDD"><em>This space inserted only to align
+ table nicely</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Creation Order <em>(8 bytes,
+ optional)</em><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td>Link Name Character Set <em>(optional)</em></td>
+ <td>Length of Link Name (variable size)</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+ <tr>
+ <td colspan="4">Link Name (variable size)</td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Link Information (variable size)<br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This document
+ describes version 1.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>This field contains information about the link and
+ controls the presence of other fields below.</p>
<table class="list">
<tr>
- <th width="20%" align="center">Bits</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0-1</code></td>
- <td>Determines the size of the <em>Length of Link Name</em>
- field.
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>The size of the <em>Length of Link Name</em>
- field is 1 byte.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>The size of the <em>Length of Link Name</em>
- field is 2 bytes.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2</code></td>
- <td>The size of the <em>Length of Link Name</em>
- field is 4 bytes.
- </td>
- </tr>
- <tr>
- <td align="center"><code>3</code></td>
- <td>The size of the <em>Length of Link Name</em>
- field is 8 bytes.
- </td>
- </tr>
- </table>
- </td>
- </tr>
- <tr>
- <td align="center"><code>2</code></td>
- <td>Creation Order Field Present: if set, the <em>Creation
- Order</em> field is present. If not set, creation order
- information is not stored for links in this group.
- </td>
- </tr>
- <tr>
- <td align="center"><code>3</code></td>
- <td>Link Type Field Present: if set, the link is not
- a hard link and the <em>Link Type</em> field is present.
- If not set, the link is a hard link.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4</code></td>
- <td>Link Name Character Set Field Present: if set, the
- link name is not represented with the ASCII character
- set and the <em>Link Name Character Set</em> field is
- present. If not set, the link name is represented with
- the ASCII character set.
- </td>
- </tr>
- <tr>
- <td align="center"><code>5-7</code></td>
- <td>Reserved (zero).
- </td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Link type</p></td>
- <td><p>This is the link class type and can be one of the following
- values:
+ <th width="20%" align="center">Bits</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0-1</code></td>
+ <td>Determines the size of the <em>Length of Link Name</em>
+ field.
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>The size of the <em>Length of Link Name</em> field is
+ 1 byte.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>The size of the <em>Length of Link Name</em> field is
+ 2 bytes.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>The size of the <em>Length of Link Name</em> field is
+ 4 bytes.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>The size of the <em>Length of Link Name</em> field is
+ 8 bytes.
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Creation Order Field Present: if set, the <em>Creation
+ Order</em> field is present. If not set, creation order information
+ is not stored for links in this group.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>Link Type Field Present: if set, the link is not a hard
+ link and the <em>Link Type</em> field is present. If not set, the
+ link is a hard link.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>4</code></td>
+ <td>Link Name Character Set Field Present: if set, the link
+ name is not represented with the ASCII character set and the <em>Link
+ Name Character Set</em> field is present. If not set, the link name
+ is represented with the ASCII character set.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>5-7</code></td>
+ <td>Reserved (zero).</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Link type</p></td>
+ <td><p>This is the link class type and can be one of the
+ following values:</p>
<table class="list">
<tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>A hard link (should never be stored in the file)
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>A soft link.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2-63</code></td>
- <td>Reserved for future HDF5 internal use.
- </td>
- </tr>
- <tr>
- <td align="center"><code>64</code></td>
- <td>An external link.
- </td>
- </tr>
- <tr>
- <td align="center"><code>65-255</code></td>
- <td>Reserved, but available for user-defined link types.
- </td>
- </tr>
- </table></p>
-
- <p>This field is present if bit 3 of <em>Flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Creation Order</p></td>
- <td><p>This 64-bit value is an index of the link&rsquo;s creation time within
- the group. Values start at 0 when the group is created an increment
- by one for each link added to the group. Removing a link from a
- group does not change existing links&rsquo; creation order field.
- </p>
- <p>This field is present if bit 2 of <em>Flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Link Name Character Set</p></td>
- <td><p>This is the character set for encoding the link&rsquo;s name:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>ASCII character set encoding (this should never be stored
- in the file)
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>UTF-8 character set encoding
- </td>
- </tr>
- </table></p>
-
- <p>This field is present if bit 4 of <em>Flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Length of link name</p></td>
- <td><p>This is the length of the link&rsquo;s name. The size of this field
- depends on bits 0 and 1 of <em>Flags</em>.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Link name</p></td>
- <td><p>This is the name of the link, non-NULL terminated.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Link information</p></td>
- <td><p>The format of this field depends on the <em>link type</em>.</p>
- <p>For <b>hard</b> links, the field is formatted as follows:
-
- <table class="list">
- <tr>
- <td width="20%"><i>Size of Offsets</i> bytes:</td>
- <td width="80%">The address of the object header for the object that the
- link points to.
- </td>
- </tr>
- </table>
- </p>
-
- <p>
- For <b>soft</b> links, the field is formatted as follows:
-
- <table class="list">
- <tr>
- <td width="20%">Bytes 1-2:</td>
- <td width="80%">Length of soft link value.</td>
- </tr>
- <tr>
- <td><em>Length of soft link value</em> bytes:</td>
- <td>A non-NULL-terminated string storing the value of the
- soft link.
- </td>
- </tr>
- </table>
- </p>
-
- <p>
- For <b>external</b> links, the field is formatted as follows:
-
- <table class="list">
- <tr>
- <td width="20%">Bytes 1-2:</td>
- <td width="80%">Length of external link value.</td>
- </tr>
- <tr>
- <td><em>Length of external link value</em> bytes:</td>
- <td>The first byte contains the version number in the
- upper 4 bits and flags in the lower 4 bits for the external
- link. Both version and flags are defined to be zero in
- this document. The remaining bytes consist of two
- NULL-terminated strings, with no padding between them.
- The first string is the name of the HDF5 file containing
- the object linked to and the second string is the full path
- to the object linked to, within the HDF5 file&rsquo;s
- group hierarchy.
- </td>
- </tr>
- </table>
- </p>
-
- <p>
- For <b>user-defined</b> links, the field is formatted as follows:
-
- <table class="list">
- <tr>
- <td width="20%">Bytes 1-2:</td>
- <td width="80%">Length of user-defined data.</td>
- </tr>
- <tr>
- <td><em>Length of user-defined link value</em> bytes:</td>
- <td>The data supplied for the user-defined link type.</td>
- </tr>
- </table>
- </p>
-
- </td>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>A hard link (should never be stored in the file)</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>A soft link.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>2-63</code></td>
+ <td>Reserved for future HDF5 internal use.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>64</code></td>
+ <td>An external link.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>65-255</code></td>
+ <td>Reserved, but available for user-defined link types.</td>
+ </tr>
+ </table>
+ <p></p>
+
+ <p>
+ This field is present if bit 3 of <em>Flags</em> is set.
+ </p></td>
</tr>
- </table>
- </div>
+
+ <tr>
+ <td><p>Creation Order</p></td>
+ <td><p>This 64-bit value is an index of the link&rsquo;s
+ creation time within the group. Values start at 0 when the group is
+ created an increment by one for each link added to the group.
+ Removing a link from a group does not change existing links&rsquo;
+ creation order field.</p>
+ <p>
+ This field is present if bit 2 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Link Name Character Set</p></td>
+ <td><p>This is the character set for encoding the
+ link&rsquo;s name:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>ASCII character set encoding (this should never be stored
+ in the file)</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>UTF-8 character set encoding</td>
+ </tr>
+ </table>
+ <p></p>
+
+ <p>
+ This field is present if bit 4 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Length of link name</p></td>
+ <td><p>
+ This is the length of the link&rsquo;s name. The size of this field
+ depends on bits 0 and 1 of <em>Flags</em>.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Link name</p></td>
+ <td><p>This is the name of the link, non-NULL terminated.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Link information</p></td>
+ <td><p>
+ The format of this field depends on the <em>link type</em>.
+ </p>
+ <p>
+ For <b>hard</b> links, the field is formatted as follows:
+
+ </p>
+ <table class="list">
+ <tr>
+ <td width="20%"><i>Size of Offsets</i> bytes:</td>
+ <td width="80%">The address of the object header for the
+ object that the link points to.</td>
+ </tr>
+ </table>
+ <p></p>
+
+ <p>
+ For <b>soft</b> links, the field is formatted as follows:
+
+ </p>
+ <table class="list">
+ <tr>
+ <td width="20%">Bytes 1-2:</td>
+ <td width="80%">Length of soft link value.</td>
+ </tr>
+ <tr>
+ <td><em>Length of soft link value</em> bytes:</td>
+ <td>A non-NULL-terminated string storing the value of the
+ soft link.</td>
+ </tr>
+ </table>
+ <p></p>
+
+ <p>
+ For <b>external</b> links, the field is formatted as follows:
+
+ </p>
+ <table class="list">
+ <tr>
+ <td width="20%">Bytes 1-2:</td>
+ <td width="80%">Length of external link value.</td>
+ </tr>
+ <tr>
+ <td><em>Length of external link value</em> bytes:</td>
+ <td>The first byte contains the version number in the upper 4
+ bits and flags in the lower 4 bits for the external link. Both
+ version and flags are defined to be zero in this document. The
+ remaining bytes consist of two NULL-terminated strings, with no
+ padding between them. The first string is the name of the HDF5
+ file containing the object linked to and the second string is the
+ full path to the object linked to, within the HDF5 file&rsquo;s
+ group hierarchy.</td>
+ </tr>
+ </table>
+ <p></p>
+
+ <p>
+ For <b>user-defined</b> links, the field is formatted as follows:
+
+ </p>
+ <table class="list">
+ <tr>
+ <td width="20%">Bytes 1-2:</td>
+ <td width="80%">Length of user-defined data.</td>
+ </tr>
+ <tr>
+ <td><em>Length of user-defined link value</em> bytes:</td>
+ <td>The data supplied for the user-defined link type.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="ExternalFileListMessage">IV.A.2.h. The Data Storage -
-External Data Files Message</a></h4>
+<h4>
+ <a name="ExternalFileListMessage">IV.A.2.h. The Data Storage -
+ External Data Files Message</a>
+</h4>
- <!-- start msgdesc table -->
- <center>
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> External
- Data Files</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0007</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>The external data storage message indicates that the data
- for an object is stored outside the HDF5 file. The filename of
- the object is stored as a Universal Resource Location (URL) of
- the actual filename containing the data. An external file list
- record also contains the byte offset of the start of the data
- within the file and the amount of space reserved in the file
- for that data.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- External File List Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td colspan="3">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="2">Allocated Slots</td>
- <td colspan="2">Used Slots</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Heap Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Slot Definitions...<br /><br /></td>
- </tr>
- </table>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> External Data Files</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0007</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The external data storage message indicates that the data
+ for an object is stored outside the HDF5 file. The filename of the
+ object is stored as a Universal Resource Location (URL) of the
+ actual filename containing the data. An external file list record
+ also contains the byte offset of the start of the data within the
+ file and the amount of space reserved in the file for that data.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
+
+<div align="center">
+ <table class="format">
+ <caption>External File List Message</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- </div>
+ <tr>
+ <td>Version</td>
+ <td colspan="3">Reserved (zero)</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number information is used for changes in the format of
- External Data Storage Message and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
- <tr>
- <td align="center"><code>0</code></td>
- <td>Never used.</td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>The current version used by the library.</td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Allocated Slots</p></td>
- <td>
- <p>The total number of slots allocated in the message. Its value must be at least as
- large as the value contained in the Used Slots field. (The current library simply
- uses the number of Used Slots for this message)</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Used Slots</p></td>
- <td>
- <p>The number of initial slots which contains valid information.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Heap Address</p></td>
- <td>
- <p>This is the address of a local heap which contains the names for the external
- files (The local heap information can be found in Disk Format Level 1D in this
- document). The name at offset zero in the heap is always the empty string.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Slot Definitions</p></td>
- <td>
- <p>The slot definitions are stored in order according to the array addresses they
- represent.</p>
- </td>
- </tr>
-
- </table>
- </div>
+ <tr>
+ <td colspan="2">Allocated Slots</td>
+ <td colspan="2">Used Slots</td>
+ </tr>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- External File List Slot
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name Offset in Local Heap<sup>L</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Offset in External Data File<sup>L</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Data Size in External File<sup>L</sup><br /><br /></td>
- </tr>
- </table>
+ <tr>
+ <td colspan="4"><br />Heap Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td colspan="4"><br />Slot Definitions...<br />
+ <br /></td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Name Offset in Local Heap</p></td>
- <td>
- <p>The byte offset within the local name heap for the name
- of the file. File names are stored as a URL which has a
- protocol name, a host name, a port number, and a file
- name:
- <code><em>protocol</em>:<em>port</em>//<em>host</em>/<em>file</em></code>.
- If the protocol is omitted then &ldquo;file:&rdquo; is assumed. If
- the port number is omitted then a default port for that
- protocol is used. If both the protocol and the port
- number are omitted then the colon can also be omitted. If
- the double slash and host name are omitted then
- &ldquo;localhost&rdquo; is assumed. The file name is the only
- mandatory part, and if the leading slash is missing then
- it is relative to the application&rsquo;s current working
- directory (the use of relative names is not
- recommended).
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Offset in External Data File</p></td>
- <td>
- <p>This is the byte offset to the start of the data in the
- specified file. For files that contain data for a single
- dataset this will usually be zero.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Data Size in External File</p></td>
- <td>
- <p>This is the total number of bytes reserved in the
- specified file for raw data storage. For a file that
- contains exactly one complete dataset which is not
- extendable, the size will usually be the exact size of the
- dataset. However, by making the size larger one allows
- HDF5 to extend the dataset. The size can be set to a value
- larger than the entire file since HDF5 will read zeroes
- past the end of the file without failing.</p>
- </td>
- </tr>
- </table>
- </div>
-
-
-<br />
-<h4><a name="LayoutMessage">IV.A.2.i. The Data Storage - Layout
-Message</a></h4>
-
- <!-- start msgdesc table -->
- <center>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number information is used for changes in the
+ format of External Data Storage Message and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Never used.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>The current version used by the library.</td>
+ </tr>
+ </table>
+ <p></p>
+
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Allocated Slots</p></td>
+ <td>
+ <p>The total number of slots allocated in the message. Its value
+ must be at least as large as the value contained in the Used Slots
+ field. (The current library simply uses the number of Used Slots
+ for this message)</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Used Slots</p></td>
+ <td>
+ <p>The number of initial slots which contains valid information.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Heap Address</p></td>
+ <td>
+ <p>This is the address of a local heap which contains the names
+ for the external files (The local heap information can be found in
+ Disk Format Level 1D in this document). The name at offset zero in
+ the heap is always the empty string.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Slot Definitions</p></td>
+ <td>
+ <p>The slot definitions are stored in order according to the
+ array addresses they represent.</p>
+ </td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>External File List Slot</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name Offset in Local Heap<sup>L</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Offset in External Data File<sup>L</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Data Size in External File<sup>L</sup><br />
+ <br /></td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;L&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Lengths&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Name Offset in Local Heap</p></td>
+ <td>
+ <p>
+ The byte offset within the local name heap for the name of the
+ file. File names are stored as a URL which has a protocol name, a
+ host name, a port number, and a file name:
+ <code>
+ <em>protocol</em>:<em>port</em>//<em>host</em>/<em>file</em>
+ </code>
+ . If the protocol is omitted then &ldquo;file:&rdquo; is assumed.
+ If the port number is omitted then a default port for that protocol
+ is used. If both the protocol and the port number are omitted then
+ the colon can also be omitted. If the double slash and host name
+ are omitted then &ldquo;localhost&rdquo; is assumed. The file name
+ is the only mandatory part, and if the leading slash is missing
+ then it is relative to the application&rsquo;s current working
+ directory (the use of relative names is not recommended).
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Offset in External Data File</p></td>
+ <td>
+ <p>This is the byte offset to the start of the data in the
+ specified file. For files that contain data for a single dataset
+ this will usually be zero.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Data Size in External File</p></td>
+ <td>
+ <p>This is the total number of bytes reserved in the specified
+ file for raw data storage. For a file that contains exactly one
+ complete dataset which is not extendable, the size will usually be
+ the exact size of the dataset. However, by making the size larger
+ one allows HDF5 to extend the dataset. The size can be set to a
+ value larger than the entire file since HDF5 will read zeroes past
+ the end of the file without failing.</p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+
+<br />
+<h4>
+ <a name="LayoutMessage">IV.A.2.i. The Data Storage - Layout Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Data Storage -
- Layout</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0008</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Required for datasets; may not
- be repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>Data layout describes how the elements of a multi-dimensional
- array are stored in the HDF5 file. Three types of data layout
- are supported:
- <ol>
- <li>Contiguous: The array is stored in one contiguous area of
- the file. This layout requires that the size of the array be
- constant: data manipulations such as chunking, compression,
- checksums, or encryption are not permitted. The message stores
- the total storage size of the array. The offset of an element
- from the beginning of the storage area is computed as in a C
- array.</li>
- <li>Chunked: The array domain is regularly decomposed into
- chunks, and each chunk is allocated and stored separately. This
- layout supports arbitrary element traversals, compression,
- encryption, and checksums. (these features are described
- in other messages). The message stores the size of a chunk
- instead of the size of the entire array; the storage size of
- the entire array can be calculated by traversing the B-tree
- that stores the chunk addresses.</li>
- <li>Compact: The array is stored in one contiguous block, as
- part of this object header message.</li>
- </ol></td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Data Layout Message (Versions 1 and 2)
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Dimensionality</td>
- <td>Layout Class</td>
- <td>Reserved <em>(zero)</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Reserved <em>(zero)</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Data Address<sup>O</sup> <em>(optional)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Dimension 0 Size</td>
- </tr>
-
- <tr>
- <td colspan="4">Dimension 1 Size</td>
- </tr>
-
- <tr>
- <td colspan="4">...</td>
- </tr>
-
- <tr>
- <td colspan="4">Dimension #n Size</td>
- </tr>
-
- <tr>
- <td colspan="4">Dataset Element Size <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Compact Data Size <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Compact Data... <em>(variable size, optional)</em><br /><br /></td>
- </tr>
- </table>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Data Storage -
+ Layout</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0008</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Required for datasets; may not be
+ repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>Data layout describes how the elements of a
+ multi-dimensional array are stored in the HDF5 file. Three types of
+ data layout are supported:
+ <ol>
+ <li>Contiguous: The array is stored in one contiguous area of
+ the file. This layout requires that the size of the array be
+ constant: data manipulations such as chunking, compression,
+ checksums, or encryption are not permitted. The message stores the
+ total storage size of the array. The offset of an element from the
+ beginning of the storage area is computed as in a C array.</li>
+ <li>Chunked: The array domain is regularly decomposed into
+ chunks, and each chunk is allocated and stored separately. This
+ layout supports arbitrary element traversals, compression,
+ encryption, and checksums. (these features are described in other
+ messages). The message stores the size of a chunk instead of the
+ size of the entire array; the storage size of the entire array can
+ be calculated by traversing the B-tree that stores the chunk
+ addresses.</li>
+ <li>Compact: The array is stored in one contiguous block, as
+ part of this object header message.</li>
+ </ol>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
+
+<div align="center">
+ <table class="format">
+ <caption>Data Layout Message (Versions 1 and 2)</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- </div>
+ <tr>
+ <td>Version</td>
+ <td>Dimensionality</td>
+ <td>Layout Class</td>
+ <td>Reserved <em>(zero)</em></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number information is used for changes in the format of the data
- layout message and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Never used.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Used by version 1.4 and before of the library to encode layout information.
- Data space is always allocated when the data set is created.</td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Used by version 1.6.x of the library to encode layout information.
- Data space is allocated only when it is necessary.</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimensionality</p></td>
- <td><p>An array has a fixed dimensionality. This field
- specifies the number of dimension size fields later in the
- message. The value stored for chunked storage is 1 greater than
- the number of dimensions in the dataset&rsquo;s dataspace.
- For example, 2 is stored for a 1 dimensional dataset.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Layout Class</p></td>
- <td><p>The layout class specifies the type of storage for the data
- and how the other fields of the layout message are to be
- interpreted.
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Compact Storage
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Contiguous Storage
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Chunked Storage
- </td>
- </tr>
- </table>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Data Address</p></td>
- <td><p>For contiguous storage, this is the address of the raw
- data in the file. For chunked storage this is the address
- of the v1 B-tree that is used to look up the addresses of the
- chunks. This field is not present for compact storage.
- If the version for this message is greater than 1, the address
- may have the &ldquo;undefined address&rdquo; value, to indicate that
- storage has not yet been allocated for this array.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Size</p></td>
- <td><p>For contiguous and compact storage the dimensions define
- the entire size of the array while for chunked storage they define
- the size of a single chunk. In all cases, they are in units of
- array elements (not bytes). The first dimension stored in the list
- of dimensions is the slowest changing dimension and the last
- dimension stored is the fastest changing dimension.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dataset Element Size</p></td>
- <td><p>The size of a dataset element, in bytes. This field is only
- present for chunked storage.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Compact Data Size</p></td>
- <td><p>This field is only present for compact data storage.
- It contains the size of the raw data for the dataset array, in
- bytes.</p>
- </td>
- </tr>
+ <tr>
+ <td colspan="4">Reserved <em>(zero)</em></td>
+ </tr>
- <tr>
- <td><p>Compact Data</p></td>
- <td><p>This field is only present for compact data storage.
- It contains the raw data for the dataset array.</p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Data Address<sup>O</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
- <br />
- <p>Version 3 of this message re-structured the format into specific
- properties that are required for each layout class.</p>
-
-
- <div align="center">
- <table class="format">
- <caption>
- <b>Data Layout Message (Version 3)</b>
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Layout Class</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Properties <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">Dimension 0 Size</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td>
- <p>The version number information is used for changes in the format of layout message
- and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>3</code></td>
- <td>Used by the version 1.6.3 and later of the library to store properties
- for each layout class.</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Layout Class</p></td>
- <td><p>The layout class specifies the type of storage for the data
- and how the other fields of the layout message are to be
- interpreted.
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Compact Storage
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Contiguous Storage
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Chunked Storage
- </td>
- </tr>
- </table>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Properties</p></td>
- <td><p>This variable-sized field encodes information specific to each
- layout class and is described below. If there is no property
- information specified for a layout class, the size of this field
- is zero bytes.</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">Dimension 1 Size</td>
+ </tr>
- <br />
- <p>Class-specific information for compact layout (Class 0): (Note: The dimensionality information
- is in the Dataspace message)</p>
-
-
- <div align="center">
- <table class="format">
- <caption>
- Compact Storage Property Description
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="2">Size</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Raw Data... <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">...</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Size</p></td>
- <td><p>This field contains the size of the raw data for the dataset
- array, in bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Raw Data</p></td>
- <td><p>This field contains the raw data for the dataset array.</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">Dimension #n Size</td>
+ </tr>
+ <tr>
+ <td colspan="4">Dataset Element Size <em>(optional)</em></td>
+ </tr>
- <br />
- <p>Class-specific information for contiguous layout (Class 1): (Note: The dimensionality information
- is in the Dataspace message)</p>
-
-
- <div align="center">
- <table class="format">
- <caption>
- Contiguous Storage Property Description
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Size<sup>L</sup><br /><br /></td>
- </tr>
- </table>
+ <tr>
+ <td colspan="4">Compact Data Size <em>(optional)</em></td>
+ </tr>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td colspan="4"><br />Compact Data... <em>(variable size,
+ optional)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+
+ <table class="note">
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Address</p></td>
- <td><p>This is the address of the raw data in the file.
- The address may have the &ldquo;undefined address&rdquo; value, to indicate
- that storage has not yet been allocated for this array.</p></td>
- </tr>
-
- <tr>
- <td><p>Size</p></td>
- <td><p>This field contains the size allocated to store the raw data,
- in bytes.
- </p>
- </td>
- </tr>
- </table>
- </div>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number information is used for changes in the
+ format of the data layout message and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <br />
- <p>Class-specific information for chunked layout (Class 2):</p>
-
-
- <div align="center">
- <table class="format">
- <caption>
- Chunked Storage Property Description
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Dimensionality</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Dimension 0 Size</td>
- </tr>
-
- <tr>
- <td colspan="4">Dimension 1 Size</td>
- </tr>
-
- <tr>
- <td colspan="4">...</td>
- </tr>
-
- <tr>
- <td colspan="4">Dimension #n Size</td>
- </tr>
-
- <tr>
- <td colspan="4">Dataset Element Size</td>
- </tr>
- </table>
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Never used.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Used by version 1.4 and before of the library to encode
+ layout information. Data space is always allocated when the data
+ set is created.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Used by version 1.6.x of the library to encode layout
+ information. Data space is allocated only when it is necessary.</td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
+ </tr>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td><p>Dimensionality</p></td>
+ <td><p>An array has a fixed dimensionality. This field
+ specifies the number of dimension size fields later in the message.
+ The value stored for chunked storage is 1 greater than the number
+ of dimensions in the dataset&rsquo;s dataspace. For example, 2 is
+ stored for a 1 dimensional dataset.</p></td>
+ </tr>
- </div>
+ <tr>
+ <td><p>Layout Class</p></td>
+ <td><p>The layout class specifies the type of storage for
+ the data and how the other fields of the layout message are to be
+ interpreted.</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Dimensionality</p></td>
- <td><p>A chunk has a fixed dimensionality. This field specifies
- the number of dimension size fields later in the message.</p></td>
- </tr>
-
- <tr>
- <td><p>Address</p></td>
- <td><p>This is the address of the v1 B-tree that is used to look up the
- addresses of the chunks that actually store portions of the array
- data. The address may have the &ldquo;undefined address&rdquo; value, to
- indicate that storage has not yet been allocated for this array.</p></td>
- </tr>
-
- <tr>
- <td><p>Dimension #n Size</p></td>
- <td><p>These values define the dimension size of a single chunk, in
- units of array elements (not bytes). The first dimension stored in
- the list of dimensions is the slowest changing dimension and the
- last dimension stored is the fastest changing dimension.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dataset Element Size</p></td>
- <td><p>The size of a dataset element, in bytes.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Compact Storage</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Contiguous Storage</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Chunked Storage</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Data Address</p></td>
+ <td><p>For contiguous storage, this is the address of the
+ raw data in the file. For chunked storage this is the address of
+ the v1 B-tree that is used to look up the addresses of the chunks.
+ This field is not present for compact storage. If the version for
+ this message is greater than 1, the address may have the
+ &ldquo;undefined address&rdquo; value, to indicate that storage has
+ not yet been allocated for this array.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Size</p></td>
+ <td><p>For contiguous and compact storage the dimensions
+ define the entire size of the array while for chunked storage they
+ define the size of a single chunk. In all cases, they are in units
+ of array elements (not bytes). The first dimension stored in the
+ list of dimensions is the slowest changing dimension and the last
+ dimension stored is the fastest changing dimension.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataset Element Size</p></td>
+ <td><p>The size of a dataset element, in bytes. This field
+ is only present for chunked storage.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Compact Data Size</p></td>
+ <td><p>This field is only present for compact data storage.
+ It contains the size of the raw data for the dataset array, in
+ bytes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Compact Data</p></td>
+ <td><p>This field is only present for compact data storage.
+ It contains the raw data for the dataset array.</p></td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="BogusMessage">IV.A.2.j. The Bogus Message</a></h4>
+<p>Version 3 of this message re-structured the format into specific
+ properties that are required for each layout class.</p>
- <!-- start msgdesc table -->
- <center>
+
+<div align="center">
+ <table class="format">
+ <caption>
+ <b>Data Layout Message (Version 3)</b>
+ </caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Layout Class</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Properties <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td>
+ <p>The version number information is used for changes in the
+ format of layout message and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>Used by the version 1.6.3 and later of the library to
+ store properties for each layout class.</td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Layout Class</p></td>
+ <td><p>The layout class specifies the type of storage for
+ the data and how the other fields of the layout message are to be
+ interpreted.</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Compact Storage</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Contiguous Storage</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Chunked Storage</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Properties</p></td>
+ <td><p>This variable-sized field encodes information
+ specific to each layout class and is described below. If there is
+ no property information specified for a layout class, the size of
+ this field is zero bytes.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<p>Class-specific information for compact layout (Class 0): (Note:
+ The dimensionality information is in the Dataspace message)</p>
+
+
+<div align="center">
+ <table class="format">
+ <caption>Compact Storage Property Description</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="2">Size</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Raw Data... <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Size</p></td>
+ <td><p>This field contains the size of the raw data for the
+ dataset array, in bytes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Raw Data</p></td>
+ <td><p>This field contains the raw data for the dataset
+ array.</p></td>
+ </tr>
+ </table>
+</div>
+
+
+<br />
+<p>Class-specific information for contiguous layout (Class 1):
+ (Note: The dimensionality information is in the Dataspace message)</p>
+
+
+<div align="center">
+ <table class="format">
+ <caption>Contiguous Storage Property Description</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Size<sup>L</sup><br />
+ <br /></td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
+
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Address</p></td>
+ <td><p>This is the address of the raw data in the file. The
+ address may have the &ldquo;undefined address&rdquo; value, to
+ indicate that storage has not yet been allocated for this array.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Size</p></td>
+ <td><p>This field contains the size allocated to store the
+ raw data, in bytes.</p></td>
+ </tr>
+ </table>
+</div>
+
+
+<br />
+<p>Class-specific information for chunked layout (Class 2):</p>
+
+
+<div align="center">
+ <table class="format">
+ <caption>Chunked Storage Property Description</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Dimensionality</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Dimension 0 Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Dimension 1 Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">...</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Dimension #n Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Dataset Element Size</td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Dimensionality</p></td>
+ <td><p>A chunk has a fixed dimensionality. This field
+ specifies the number of dimension size fields later in the message.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Address</p></td>
+ <td><p>This is the address of the v1 B-tree that is used to
+ look up the addresses of the chunks that actually store portions of
+ the array data. The address may have the &ldquo;undefined
+ address&rdquo; value, to indicate that storage has not yet been
+ allocated for this array.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dimension #n Size</p></td>
+ <td><p>These values define the dimension size of a single
+ chunk, in units of array elements (not bytes). The first dimension
+ stored in the list of dimensions is the slowest changing dimension
+ and the last dimension stored is the fastest changing dimension.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataset Element Size</p></td>
+ <td><p>The size of a dataset element, in bytes.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="BogusMessage">IV.A.2.j. The Bogus Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Bogus</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0009</td></tr>
- <tr><td colspan="2"><b>Length:</b> 4 bytes</td></tr>
- <tr><td colspan="2"><b>Status:</b> For testing only; should never
- be stored in a valid file.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>This message is used for testing the HDF5 Library&rsquo;s
- response to an &ldquo;unknown&rdquo; message type and should
- never be encountered in a valid HDF5 file.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Bogus Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="4">Bogus Value</td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Bogus</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0009</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> 4 bytes</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> For testing only; should never be
+ stored in a valid file.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>This message is used for testing the HDF5 Library&rsquo;s
+ response to an &ldquo;unknown&rdquo; message type and should never
+ be encountered in a valid HDF5 file.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Bogus Value</p></td>
- <td>
- <p>This value should always be: <code>0xdeadbeef</code>.</p>
- </td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Bogus Message</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4">Bogus Value</td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="GroupInfoMessage">IV.A.2.k. The Group Info Message
-</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Bogus Value</p></td>
+ <td>
+ <p>
+ This value should always be:
+ <code>0xdeadbeef</code>
+ .
+ </p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="GroupInfoMessage">IV.A.2.k. The Group Info Message </a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Group Info</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x000A</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td><p>This message stores information for the constants defining
- a &ldquo;new style&rdquo; group&rsquo;s behavior. Constant
- information will be stored in this message and variable
- information will be stored in the
- <a href="#LinkInfoMessage">Link Info</a> message.</p>
- <p>Note: the &ldquo;estimated entry&rdquo; information below is
- used when determining the size of the object header for the
- group when it is created.</p></td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Group Info Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td colspan="2">Link Phase Change: Maximum Compact Value <em>(optional)</em></td>
- </tr>
- <tr>
- <td colspan="2">Link Phase Change: Minimum Dense Value <em>(optional)</em></td>
- <td colspan="2">Estimated Number of Entries <em>(optional)</em></td>
- </tr>
- <tr>
- <td colspan="2">Estimated Link Name Length of Entries <em>(optional)</em></td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Group Info</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x000A</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td><p>
+ This message stores information for the constants defining a
+ &ldquo;new style&rdquo; group&rsquo;s behavior. Constant
+ information will be stored in this message and variable information
+ will be stored in the <a href="#LinkInfoMessage">Link Info</a>
+ message.
+ </p>
+ <p>Note: the &ldquo;estimated entry&rdquo; information below is
+ used when determining the size of the object header for the group
+ when it is created.</p></td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Group Info Message</caption>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This document describes version 0.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>This is the group information flag with the following definition:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set, link phase change values are stored.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>If set, the estimated entry information is non-default
- and is stored.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2-7</code></td>
- <td>Reserved</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Link Phase Change: Maximum Compact Value</p></td>
- <td><p>The is the maximum number of links to store &ldquo;compactly&rdquo; (in
- the group&rsquo;s object header).</p>
- <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Link Phase Change: Minimum Dense Value</p></td>
- <td><p>This is the minimum number of links to store &ldquo;densely&rdquo; (in
- the group&rsquo;s fractal heap). The fractal heap&rsquo;s address is
- located in the <a href="#LinkInfoMessage">Link Info</a>
- message.</p>
- <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Estimated Number of Entries</p></td>
- <td><p>This is the estimated number of entries in groups.</p>
- <p>If this field is not present, the default value of <code>4</code>
- will be used for the estimated number of group entries.</p>
- <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Estimated Link Name Length of Entries</p></td>
- <td><p>This is the estimated length of entry name.</p>
- <p>If this field is not present, the default value of <code>8</code>
- will be used for the estimated link name length of group entries.</p>
- <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
- </td>
- </tr>
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- </table>
- </div>
- </p>
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td colspan="2">Link Phase Change: Maximum Compact Value <em>(optional)</em></td>
+ </tr>
+ <tr>
+ <td colspan="2">Link Phase Change: Minimum Dense Value <em>(optional)</em></td>
+ <td colspan="2">Estimated Number of Entries <em>(optional)</em></td>
+ </tr>
+ <tr>
+ <td colspan="2">Estimated Link Name Length of Entries <em>(optional)</em></td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ </table>
+</div>
<br />
-<h4><a name="FilterMessage">IV.A.2.l. The Data Storage - Filter
-Pipeline Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This document
+ describes version 0.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>This is the group information flag with the following
+ definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set, link phase change values are stored.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>If set, the estimated entry information is non-default
+ and is stored.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>2-7</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Link Phase Change: Maximum Compact Value</p></td>
+ <td><p>The is the maximum number of links to store
+ &ldquo;compactly&rdquo; (in the group&rsquo;s object header).</p>
+ <p>
+ This field is present if bit 0 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Link Phase Change: Minimum Dense Value</p></td>
+ <td><p>
+ This is the minimum number of links to store &ldquo;densely&rdquo;
+ (in the group&rsquo;s fractal heap). The fractal heap&rsquo;s
+ address is located in the <a href="#LinkInfoMessage">Link Info</a>
+ message.
+ </p>
+ <p>
+ This field is present if bit 0 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Estimated Number of Entries</p></td>
+ <td><p>This is the estimated number of entries in groups.</p>
+ <p>
+ If this field is not present, the default value of
+ <code>4</code>
+ will be used for the estimated number of group entries.
+ </p>
+ <p>
+ This field is present if bit 1 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Estimated Link Name Length of Entries</p></td>
+ <td><p>This is the estimated length of entry name.</p>
+ <p>
+ If this field is not present, the default value of
+ <code>8</code>
+ will be used for the estimated link name length of group entries.
+ </p>
+ <p>
+ This field is present if bit 1 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ </table>
+</div>
+<p></p>
+
+<br />
+<h4>
+ <a name="FilterMessage">IV.A.2.l. The Data Storage - Filter
+ Pipeline Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b>
- Data Storage - Filter Pipeline</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x000B</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td><p>This message describes the filter pipeline which should
- be applied to the data stream by providing filter identification
- numbers, flags, a name, and client data.</p>
- <p>This message may be present in the object headers of both
- dataset and group objects. For datasets, it specifies the
- filters to apply to raw data. For groups, it specifies the
- filters to apply to the group&rsquo;s fractal heap. Currently,
- only datasets using chunked data storage use the filter
- pipeline on their raw data.</p></td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Filter Pipeline Message - Version 1
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Number of Filters</td>
- <td colspan="2">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="4">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Filter Description List <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Data Storage -
+ Filter Pipeline</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x000B</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td><p>This message describes the filter pipeline which
+ should be applied to the data stream by providing filter
+ identification numbers, flags, a name, and client data.</p>
+ <p>This message may be present in the object headers of both
+ dataset and group objects. For datasets, it specifies the filters
+ to apply to raw data. For groups, it specifies the filters to apply
+ to the group&rsquo;s fractal heap. Currently, only datasets using
+ chunked data storage use the filter pipeline on their raw data.</p></td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This table
- describes version 1.</p></td>
- </tr>
-
- <tr>
- <td><p>Number of Filters</p></td>
- <td><p>The total number of filters described in this
- message. The maximum possible number of filters in a
- message is 32.</p></td>
- </tr>
-
- <tr>
- <td><p>Filter Description List</p></td>
- <td><p>A description of each filter. A filter description
- appears in the next table.</p></td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Filter Pipeline Message - Version 1</caption>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Filter Description
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="2">Filter Identification Value</td>
- <td colspan="2">Name Length</td>
- </tr>
-
- <tr>
- <td colspan="2">Flags</td>
- <td colspan="2">Number Client Data Values</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name <em>(variable size, optional)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Client Data <em>(variable size, optional)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Padding <em>(variable size, optional)</em></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Filter Identification Value</p></td>
- <td>
- <p>
- This value, often referred to as a filter identifier,
- is designed to be a unique identifier for the filter.
- Values from zero through 32,767 are reserved for filters
- supported by The HDF Group in the HDF5 Library and for
- filters requested and supported by third parties.
- Filters supported by The HDF Group are documented immediately
- below. Information on 3rd-party filters can be found at
- The HDF Group&rsquo;s
- <a href="http://www.hdfgroup.org/services/contributions.html">
- Contributions</a> page.</p>
-
- <p>
- To request a filter identifier, please contact
- The HDF Group&rsquo;s Help Desk at
- <img src="Graphics/help.png" valign="middle" height="14"
- alt="The HDF Group Help Desk">.
- You will be asked to provide the following information:</p>
- <ol>
- <li>Contact information for the developer requesting the
- new identifier</li>
- <li>A short description of the new filter</li>
- <li>Links to any relevant information, including licensing
- information</li>
- </ol>
- <p>
- Values from 32768 to 65535 are reserved for non-distributed uses
- (for example, internal company usage) or for application usage
- when testing a feature. The HDF Group does not track or document
- the use of the filters with identifiers from this range.</p>
-
- <p>
- The filters currently in library version 1.8.0 are
- listed below:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Identification</th>
- <th width="15%" align="left">Name</th>
- <th width="65%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>N/A</td>
- <td>Reserved</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>deflate</td>
- <td>GZIP deflate compression</td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>shuffle</td>
- <td>Data element shuffling</td>
- </tr>
-
- <tr>
- <td align="center"><code>3</code></td>
- <td>fletcher32</td>
- <td>Fletcher32 checksum</td>
- </tr>
-
- <tr>
- <td align="center"><code>4</code></td>
- <td>szip</td>
- <td>SZIP compression</td>
- </tr>
-
- <tr>
- <td align="center"><code>5</code></td>
- <td>nbit</td>
- <td>N-bit packing</td>
- </tr>
-
- <tr>
- <td align="center"><code>6</code></td>
- <td>scaleoffset</td>
- <td>Scale and offset encoded values</td>
- </tr>
- </table>
- </p></td>
- </tr>
-
- <tr>
- <td><p>Name Length</p></td>
- <td><p>Each filter has an optional null-terminated ASCII name
- and this field holds the length of the name including the
- null termination padded with nulls to be a multiple of
- eight. If the filter has no name then a value of zero is
- stored in this field.</p></td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>The flags indicate certain properties for a filter. The
- bit values defined so far are:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set then the filter is an optional filter.
- During output, if an optional filter fails it will be
- silently skipped in the pipeline.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1-15</code></td>
- <td>Reserved (zero)</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Number of Client Data Values</p></td>
- <td><p>Each filter can store integer values to control
- how the filter operates. The number of entries in the
- <em>Client Data</em> array is stored in this field.</p></td>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td><p>If the <em>Name Length</em> field is non-zero then it will
- contain the size of this field, padded to a multiple of eight. This
- field contains a null-terminated, ASCII character
- string to serve as a comment/name for the filter.</p></td>
- </tr>
-
- <tr>
- <td><p>Client Data</p></td>
- <td><p>This is an array of four-byte integers which will be
- passed to the filter function. The <em>Client Data Number</em> of
- Values determines the number of elements in the array.</p></td>
- </tr>
-
- <tr>
- <td><p>Padding</p></td>
- <td><p>Four bytes of zeroes are added to the message at this
- point if the Client Data Number of Values field contains
- an odd number.</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td>Version</td>
+ <td>Number of Filters</td>
+ <td colspan="2">Reserved (zero)</td>
+ </tr>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Filter Pipeline Message - Version 2
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Number of Filters</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Filter Description List <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4">Reserved (zero)</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This table
- describes version 2.</p></td>
- </tr>
-
- <tr>
- <td><p>Number of Filters</p></td>
- <td><p>The total number of filters described in this
- message. The maximum possible number of filters in a
- message is 32.</p></td>
- </tr>
-
- <tr>
- <td><p>Filter Description List</p></td>
- <td><p>A description of each filter. A filter description
- appears in the next table.</p></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="4"><br />Filter Description List <em>(variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Filter Description
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="2">Filter Identification Value</td>
- <td colspan="2">Name Length <em>(optional)</em></td>
- </tr>
-
- <tr>
- <td colspan="2">Flags</td>
- <td colspan="2">Number Client Data Values</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name <em>(variable size, optional)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Client Data <em>(variable size, optional)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Filter Identification Value</p></td>
- <td>
- <p>
- This value, often referred to as a filter identifier,
- is designed to be a unique identifier for the filter.
- Values from zero through 32,767 are reserved for filters
- supported by The HDF Group in the HDF5 Library and for
- filters requested and supported by third parties.
- Filters supported by The HDF Group are documented immediately
- below. Information on 3rd-party filters can be found at
- The HDF Group&rsquo;s
- <a href="http://www.hdfgroup.org/services/contributions.html">
- Contributions</a> page.</p>
-
- <p>
- To request a filter identifier, please contact
- The HDF Group&rsquo;s Help Desk at
- <img src="Graphics/help.png" valign="middle" height="14"
- alt="The HDF Group Help Desk">.
- You will be asked to provide the following information:</p>
- <ol>
- <li>Contact information for the developer requesting the
- new identifier</li>
- <li>A short description of the new filter</li>
- <li>Links to any relevant information, including licensing
- information</li>
- </ol>
- <p>
- Values from 32768 to 65535 are reserved for non-distributed uses
- (for example, internal company usage) or for application usage
- when testing a feature. The HDF Group does not track or document
- the use of the filters with identifiers from this range.</p>
-
- <p>
- The filters currently in library version 1.8.0 are
- listed below:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Identification</th>
- <th width="15%" align="left">Name</th>
- <th width="65%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>N/A</td>
- <td>Reserved</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>deflate</td>
- <td>GZIP deflate compression</td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>shuffle</td>
- <td>Data element shuffling</td>
- </tr>
-
- <tr>
- <td align="center"><code>3</code></td>
- <td>fletcher32</td>
- <td>Fletcher32 checksum</td>
- </tr>
-
- <tr>
- <td align="center"><code>4</code></td>
- <td>szip</td>
- <td>SZIP compression</td>
- </tr>
-
- <tr>
- <td align="center"><code>5</code></td>
- <td>nbit</td>
- <td>N-bit packing</td>
- </tr>
-
- <tr>
- <td align="center"><code>6</code></td>
- <td>scaleoffset</td>
- <td>Scale and offset encoded values</td>
- </tr>
- </table>
- </p></td>
- </tr>
-
- <tr>
- <td><p>Name Length</p></td>
- <td><p>Each filter has an optional null-terminated ASCII name
- and this field holds the length of the name including the
- null termination padded with nulls to be a multiple of
- eight. If the filter has no name then a value of zero is
- stored in this field.</p>
- <p>Filters with IDs less than 256 (in other words, filters
- that are defined in this format documentation) do not store
- the <em>Name Length</em> or <em>Name</em> fields.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>The flags indicate certain properties for a filter. The
- bit values defined so far are:
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set then the filter is an optional filter.
- During output, if an optional filter fails it will be
- silently skipped in the pipeline.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1-15</code></td>
- <td>Reserved (zero)</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Number of Client Data Values</p></td>
- <td><p>Each filter can store integer values to control
- how the filter operates. The number of entries in the
- <em>Client Data</em> array is stored in this field.</p></td>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td><p>If the <em>Name Length</em> field is non-zero then it will
- contain the size of this field, <em>not</em> padded to a multiple
- of eight. This field contains a <em>non-</em>null-terminated,
- ASCII character string to serve as a comment/name for the filter.
- </p>
- <p>Filters that are defined in this format documentation
- such as deflate and shuffle do not store the <em>Name
- Length</em> or <em>Name</em> fields.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Client Data</p></td>
- <td><p>This is an array of four-byte integers which will be
- passed to the filter function. The Client Data Number of
- Values</em> determines the number of elements in the array.</p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This table
+ describes version 1.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Number of Filters</p></td>
+ <td><p>The total number of filters described in this
+ message. The maximum possible number of filters in a message is 32.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Filter Description List</p></td>
+ <td><p>A description of each filter. A filter description
+ appears in the next table.</p></td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="AttributeMessage">IV.A.2.m. The Attribute Message</a></h4>
+<div align="center">
+ <table class="format">
+ <caption>Filter Description</caption>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="2">Filter Identification Value</td>
+ <td colspan="2">Name Length</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Flags</td>
+ <td colspan="2">Number Client Data Values</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name <em>(variable size, optional)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Client Data <em>(variable size,
+ optional)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Padding <em>(variable size, optional)</em></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Filter Identification Value</p></td>
+ <td>
+ <p>
+ This value, often referred to as a filter identifier, is designed
+ to be a unique identifier for the filter. Values from zero through
+ 32,767 are reserved for filters supported by The HDF Group in the
+ HDF5 Library and for filters requested and supported by third
+ parties. Filters supported by The HDF Group are documented
+ immediately below. Information on 3rd-party filters can be found at
+ The HDF Group&rsquo;s <a
+ href="http://www.hdfgroup.org/services/contributions.html">
+ Contributions</a> page.
+ </p>
+
+ <p>
+ To request a filter identifier, please contact The HDF
+ Group&rsquo;s Help Desk at <img src="Graphics/help.png"
+ valign="middle" height="14" alt="The HDF Group Help Desk">.
+ You will be asked to provide the following information:
+ </p>
+ <ol>
+ <li>Contact information for the developer requesting the new
+ identifier</li>
+ <li>A short description of the new filter</li>
+ <li>Links to any relevant information, including licensing
+ information</li>
+ </ol>
+ <p>Values from 32768 to 65535 are reserved for non-distributed
+ uses (for example, internal company usage) or for application usage
+ when testing a feature. The HDF Group does not track or document
+ the use of the filters with identifiers from this range.</p>
+
+ <p>The filters currently in library version 1.8.0 are listed
+ below:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Identification</th>
+ <th width="15%" align="left">Name</th>
+ <th width="65%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>N/A</td>
+ <td>Reserved</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>deflate</td>
+ <td>GZIP deflate compression</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>shuffle</td>
+ <td>Data element shuffling</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>fletcher32</td>
+ <td>Fletcher32 checksum</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>4</code></td>
+ <td>szip</td>
+ <td>SZIP compression</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>5</code></td>
+ <td>nbit</td>
+ <td>N-bit packing</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>6</code></td>
+ <td>scaleoffset</td>
+ <td>Scale and offset encoded values</td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Name Length</p></td>
+ <td><p>Each filter has an optional null-terminated ASCII
+ name and this field holds the length of the name including the null
+ termination padded with nulls to be a multiple of eight. If the
+ filter has no name then a value of zero is stored in this field.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>The flags indicate certain properties for a filter.
+ The bit values defined so far are:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set then the filter is an optional filter. During
+ output, if an optional filter fails it will be silently skipped
+ in the pipeline.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1-15</code></td>
+ <td>Reserved (zero)</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Number of Client Data Values</p></td>
+ <td><p>
+ Each filter can store integer values to control how the filter
+ operates. The number of entries in the <em>Client Data</em> array
+ is stored in this field.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name</p></td>
+ <td><p>
+ If the <em>Name Length</em> field is non-zero then it will contain
+ the size of this field, padded to a multiple of eight. This field
+ contains a null-terminated, ASCII character string to serve as a
+ comment/name for the filter.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Client Data</p></td>
+ <td><p>
+ This is an array of four-byte integers which will be passed to the
+ filter function. The <em>Client Data Number</em> of Values
+ determines the number of elements in the array.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Padding</p></td>
+ <td><p>Four bytes of zeroes are added to the message at this
+ point if the Client Data Number of Values field contains an odd
+ number.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Filter Pipeline Message - Version 2</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Number of Filters</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Filter Description List <em>(variable
+ size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This table
+ describes version 2.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Number of Filters</p></td>
+ <td><p>The total number of filters described in this
+ message. The maximum possible number of filters in a message is 32.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Filter Description List</p></td>
+ <td><p>A description of each filter. A filter description
+ appears in the next table.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Filter Description</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="2">Filter Identification Value</td>
+ <td colspan="2">Name Length <em>(optional)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Flags</td>
+ <td colspan="2">Number Client Data Values</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name <em>(variable size, optional)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Client Data <em>(variable size,
+ optional)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Filter Identification Value</p></td>
+ <td>
+ <p>
+ This value, often referred to as a filter identifier, is designed
+ to be a unique identifier for the filter. Values from zero through
+ 32,767 are reserved for filters supported by The HDF Group in the
+ HDF5 Library and for filters requested and supported by third
+ parties. Filters supported by The HDF Group are documented
+ immediately below. Information on 3rd-party filters can be found at
+ The HDF Group&rsquo;s <a
+ href="http://www.hdfgroup.org/services/contributions.html">
+ Contributions</a> page.
+ </p>
+
+ <p>
+ To request a filter identifier, please contact The HDF
+ Group&rsquo;s Help Desk at <img src="Graphics/help.png"
+ valign="middle" height="14" alt="The HDF Group Help Desk">.
+ You will be asked to provide the following information:
+ </p>
+ <ol>
+ <li>Contact information for the developer requesting the new
+ identifier</li>
+ <li>A short description of the new filter</li>
+ <li>Links to any relevant information, including licensing
+ information</li>
+ </ol>
+ <p>Values from 32768 to 65535 are reserved for non-distributed
+ uses (for example, internal company usage) or for application usage
+ when testing a feature. The HDF Group does not track or document
+ the use of the filters with identifiers from this range.</p>
+
+ <p>The filters currently in library version 1.8.0 are listed
+ below:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Identification</th>
+ <th width="15%" align="left">Name</th>
+ <th width="65%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>N/A</td>
+ <td>Reserved</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>deflate</td>
+ <td>GZIP deflate compression</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>shuffle</td>
+ <td>Data element shuffling</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>fletcher32</td>
+ <td>Fletcher32 checksum</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>4</code></td>
+ <td>szip</td>
+ <td>SZIP compression</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>5</code></td>
+ <td>nbit</td>
+ <td>N-bit packing</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>6</code></td>
+ <td>scaleoffset</td>
+ <td>Scale and offset encoded values</td>
+ </tr>
+ </table>
+ <p></p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Name Length</p></td>
+ <td><p>Each filter has an optional null-terminated ASCII
+ name and this field holds the length of the name including the null
+ termination padded with nulls to be a multiple of eight. If the
+ filter has no name then a value of zero is stored in this field.</p>
+ <p>
+ Filters with IDs less than 256 (in other words, filters that are
+ defined in this format documentation) do not store the <em>Name
+ Length</em> or <em>Name</em> fields.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>The flags indicate certain properties for a filter.
+ The bit values defined so far are:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set then the filter is an optional filter. During
+ output, if an optional filter fails it will be silently skipped
+ in the pipeline.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1-15</code></td>
+ <td>Reserved (zero)</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Number of Client Data Values</p></td>
+ <td><p>
+ Each filter can store integer values to control how the filter
+ operates. The number of entries in the <em>Client Data</em> array
+ is stored in this field.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name</p></td>
+ <td><p>
+ If the <em>Name Length</em> field is non-zero then it will contain
+ the size of this field, <em>not</em> padded to a multiple of eight.
+ This field contains a <em>non-</em>null-terminated, ASCII character
+ string to serve as a comment/name for the filter.
+ </p>
+ <p>
+ Filters that are defined in this format documentation such as
+ deflate and shuffle do not store the <em>Name Length</em> or <em>Name</em>
+ fields.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Client Data</p></td>
+ <td><p>
+ This is an array of four-byte integers which will be passed to the
+ filter function. The Client Data Number of Values<em></em>
+ determines the number of elements in the array.
+ </p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="AttributeMessage">IV.A.2.m. The Attribute Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Attribute</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x000C</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td><p>The <em>Attribute</em> message is used to store objects
- in the HDF5 file which are used as attributes, or
- &ldquo;metadata&rdquo; about the current object. An attribute
- is a small dataset; it has a name, a datatype, a dataspace, and
- raw data. Since attributes are stored in the object header, they
- should be relatively small (in other words, less than 64KB).
- They can be associated with any type of object which has an
- object header (groups, datasets, or committed (named)
- datatypes).</p>
- <p>In 1.8.x versions of the library, attributes can be larger
- than 64KB. See the
- <a href="UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FAttributes%2FHDF5_Attributes.htm%3Frhtocid%3Dtoc8.2_1%23TOC_8_5_Special_Issuesbc-13">
- &ldquo;Special Issues&rdquo;</a> section of the Attributes chapter
- in the <cite>HDF5 User&rsquo;s Guide</cite> for more information.</p>
- <p>Note: Attributes on an object must have unique names:
- the HDF5 Library currently enforces this by causing the
- creation of an attribute with a duplicate name to fail.
- Attributes on different objects may have the same name,
- however.</p></td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Attribute Message (Version 1)
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Reserved (zero)</td>
- <td colspan="2">Name Size</td>
- </tr>
-
- <tr>
- <td colspan="2">Datatype Size</td>
- <td colspan="2">Dataspace Size</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Attribute</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x000C</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td><p>
+ The <em>Attribute</em> message is used to store objects in the HDF5
+ file which are used as attributes, or &ldquo;metadata&rdquo; about
+ the current object. An attribute is a small dataset; it has a name,
+ a datatype, a dataspace, and raw data. Since attributes are stored
+ in the object header, they should be relatively small (in other
+ words, less than 64KB). They can be associated with any type of
+ object which has an object header (groups, datasets, or committed
+ (named) datatypes).
+ </p>
+ <p>
+ In 1.8.x versions of the library, attributes can be larger than
+ 64KB. See the <a
+ href="UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_User_Guide%2FAttributes%2FHDF5_Attributes.htm%3Frhtocid%3Dtoc8.2_1%23TOC_8_5_Special_Issuesbc-13">
+ &ldquo;Special Issues&rdquo;</a> section of the Attributes chapter in
+ the <cite>HDF5 User Guide</cite> for more information.
+ </p>
+ <p>Note: Attributes on an object must have unique names: the
+ HDF5 Library currently enforces this by causing the creation of an
+ attribute with a duplicate name to fail. Attributes on different
+ objects may have the same name, however.</p></td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number information is used for changes in the format of the
- attribute message and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Never used.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Used by the library before version 1.6 to encode attribute message.
- This version does not support shared datatypes.</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Name Size</p></td>
- <td><p>The length of the attribute name in bytes including the
- null terminator. Note that the <em>Name</em> field below may
- contain additional padding not represented by this
- field.</p></td>
- </tr>
-
- <tr>
- <td><p>Datatype Size</p></td>
- <td><p>The length of the datatype description in the <em>Datatype</em>
- field below. Note that the <em>Datatype</em> field may contain
- additional padding not represented by this field.</p></td>
- </tr>
-
- <tr>
- <td><p>Dataspace Size</p></td>
- <td><p>The length of the dataspace description in the <em>Dataspace</em>
- field below. Note that the <em>Dataspace</em> field may contain
- additional padding not represented by this field.</p></td>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td><p>The null-terminated attribute name. This field is
- padded with additional null characters to make it a
- multiple of eight bytes.</p></td>
- </tr>
-
- <tr>
- <td><p>Datatype</p></td>
- <td><p>The datatype description follows the same format as
- described for the datatype object header message. This
- field is padded with additional zero bytes to make it a
- multiple of eight bytes.</p></td>
- </tr>
-
- <tr>
- <td><p>Dataspace</p></td>
- <td><p>The dataspace description follows the same format as
- described for the dataspace object header message. This
- field is padded with additional zero bytes to make it a
- multiple of eight bytes.</p></td>
- </tr>
-
- <tr>
- <td><p>Data</p></td>
- <td><p>The raw data for the attribute. The size is determined
- from the datatype and dataspace descriptions. This
- field is <em>not</em> padded with additional bytes.</p></td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Attribute Message (Version 1)</caption>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Attribute Message (Version 2)
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td colspan="2">Name Size</td>
- </tr>
-
- <tr>
- <td colspan="2">Datatype Size</td>
- <td colspan="2">Dataspace Size</td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number information is used for changes in the
- format of the attribute message and is described here:
+ <tr>
+ <td>Version</td>
+ <td>Reserved (zero)</td>
+ <td colspan="2">Name Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Datatype Size</td>
+ <td colspan="2">Dataspace Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Datatype <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Dataspace <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Data <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number information is used for changes in
+ the format of the attribute message and is described here:</p>
<table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>Used by the library of version 1.6.x and after to encode
- attribute messages.
- This version supports shared datatypes. The fields of
- name, datatype, and dataspace are not padded with
- additional bytes of zero.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>This bit field contains extra information about
- interpreting the attribute message:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set, datatype is shared.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>If set, dataspace is shared.</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Name Size</p></td>
- <td><p>The length of the attribute name in bytes including the
- null terminator.</p></td>
- </tr>
-
- <tr>
- <td><p>Datatype Size</p></td>
- <td><p>The length of the datatype description in the <em>Datatype</em>
- field below.</p></td>
- </tr>
-
- <tr>
- <td><p>Dataspace Size</p></td>
- <td><p>The length of the dataspace description in the <em>Dataspace</em>
- field below.</p></td>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td><p>The null-terminated attribute name. This field is <em>not</em>
- padded with additional bytes.</p></td>
- </tr>
-
- <tr>
- <td><p>Datatype</p></td>
- <td><p>The datatype description follows the same format as
- described for the datatype object header message.
- </p>
- <p>If the
- <em>Flag</em> field indicates this attribute&rsquo;s datatype is
- shared, this field will contain a &ldquo;shared message&rdquo; encoding
- instead of the datatype encoding.
- </p>
- <p>This field is <em>not</em> padded with additional bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dataspace</p></td>
- <td><p>The dataspace description follows the same format as
- described for the dataspace object header message.
- </p>
- <p>If the
- <em>Flag</em> field indicates this attribute&rsquo;s dataspace is
- shared, this field will contain a &ldquo;shared message&rdquo; encoding
- instead of the dataspace encoding.
- </p>
- <p>This field is <em>not</em> padded with additional bytes.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Data</p></td>
- <td><p>The raw data for the attribute. The size is determined
- from the datatype and dataspace descriptions.
- </p>
- <p>This field is <em>not</em> padded with additional zero bytes.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
- <br />
- <div align="center">
- <table class="format">
- <caption>
- Attribute Message (Version 3)
- </caption>
-
- <tr align="center">
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td colspan="2">Name Size</td>
- </tr>
-
- <tr>
- <td colspan="2">Datatype Size</td>
- <td colspan="2">Dataspace Size</td>
- </tr>
-
- <tr>
- <td>Name Character Set Encoding</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Never used.</td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number information is used for changes in the
- format of the attribute message and is described here:
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Used by the library before version 1.6 to encode
+ attribute message. This version does not support shared
+ datatypes.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name Size</p></td>
+ <td><p>
+ The length of the attribute name in bytes including the null
+ terminator. Note that the <em>Name</em> field below may contain
+ additional padding not represented by this field.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Datatype Size</p></td>
+ <td><p>
+ The length of the datatype description in the <em>Datatype</em>
+ field below. Note that the <em>Datatype</em> field may contain
+ additional padding not represented by this field.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataspace Size</p></td>
+ <td><p>
+ The length of the dataspace description in the <em>Dataspace</em>
+ field below. Note that the <em>Dataspace</em> field may contain
+ additional padding not represented by this field.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name</p></td>
+ <td><p>The null-terminated attribute name. This field is
+ padded with additional null characters to make it a multiple of
+ eight bytes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Datatype</p></td>
+ <td><p>The datatype description follows the same format as
+ described for the datatype object header message. This field is
+ padded with additional zero bytes to make it a multiple of eight
+ bytes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataspace</p></td>
+ <td><p>The dataspace description follows the same format as
+ described for the dataspace object header message. This field is
+ padded with additional zero bytes to make it a multiple of eight
+ bytes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Data</p></td>
+ <td><p>
+ The raw data for the attribute. The size is determined from the
+ datatype and dataspace descriptions. This field is <em>not</em>
+ padded with additional bytes.
+ </p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="format">
+ <caption>Attribute Message (Version 2)</caption>
+
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td colspan="2">Name Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Datatype Size</td>
+ <td colspan="2">Dataspace Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Datatype <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Dataspace <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Data <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number information is used for changes in
+ the format of the attribute message and is described here:</p>
<table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>3</code></td>
- <td>Used by the library of version 1.8.x and after to
- encode attribute messages.
- This version supports attributes with non-ASCII names.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>This bit field contains extra information about
- interpreting the attribute message:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set, datatype is shared.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>If set, dataspace is shared.</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Name Size</p></td>
- <td><p>The length of the attribute name in bytes including the
- null terminator.</p></td>
- </tr>
-
- <tr>
- <td><p>Datatype Size</p></td>
- <td><p>The length of the datatype description in the <em>Datatype</em>
- field below.</p></td>
- </tr>
-
- <tr>
- <td><p>Dataspace Size</p></td>
- <td><p>The length of the dataspace description in the <em>Dataspace</em>
- field below.</p></td>
- </tr>
-
- <tr>
- <td><p>Name Character Set Encoding</p></td>
- <td><p>The character set encoding for the attribute&rsquo;s name:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>ASCII character set encoding
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>UTF-8 character set encoding
- </td>
- </tr>
- </table>
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td><p>The null-terminated attribute name. This field is <em>not</em>
- padded with additional bytes.</p></td>
- </tr>
-
- <tr>
- <td><p>Datatype</p></td>
- <td><p>The datatype description follows the same format as
- described for the datatype object header message.
- </p>
- <p>If the
- <em>Flag</em> field indicates this attribute&rsquo;s datatype is
- shared, this field will contain a &ldquo;shared message&rdquo; encoding
- instead of the datatype encoding.
- </p>
- <p>This field is <em>not</em> padded with additional bytes.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Dataspace</p></td>
- <td><p>The dataspace description follows the same format as
- described for the dataspace object header message.
- </p>
- <p>If the
- <em>Flag</em> field indicates this attribute&rsquo;s dataspace is
- shared, this field will contain a &ldquo;shared message&rdquo; encoding
- instead of the dataspace encoding.
- </p>
- <p>This field is <em>not</em> padded with additional bytes.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Data</p></td>
- <td><p>The raw data for the attribute. The size is determined
- from the datatype and dataspace descriptions.
- </p>
- <p>This field is <em>not</em> padded with additional zero bytes.
- </p>
- </td>
- </tr>
- </table>
- </div>
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>Used by the library of version 1.6.x and after to encode
+ attribute messages. This version supports shared datatypes. The
+ fields of name, datatype, and dataspace are not padded with
+ additional bytes of zero.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>This bit field contains extra information about
+ interpreting the attribute message:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set, datatype is shared.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>If set, dataspace is shared.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name Size</p></td>
+ <td><p>The length of the attribute name in bytes including
+ the null terminator.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Datatype Size</p></td>
+ <td><p>
+ The length of the datatype description in the <em>Datatype</em>
+ field below.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataspace Size</p></td>
+ <td><p>
+ The length of the dataspace description in the <em>Dataspace</em>
+ field below.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name</p></td>
+ <td><p>
+ The null-terminated attribute name. This field is <em>not</em>
+ padded with additional bytes.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Datatype</p></td>
+ <td><p>The datatype description follows the same format as
+ described for the datatype object header message.</p>
+ <p>
+ If the <em>Flag</em> field indicates this attribute&rsquo;s
+ datatype is shared, this field will contain a &ldquo;shared
+ message&rdquo; encoding instead of the datatype encoding.
+ </p>
+ <p>
+ This field is <em>not</em> padded with additional bytes.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataspace</p></td>
+ <td><p>The dataspace description follows the same format as
+ described for the dataspace object header message.</p>
+ <p>
+ If the <em>Flag</em> field indicates this attribute&rsquo;s
+ dataspace is shared, this field will contain a &ldquo;shared
+ message&rdquo; encoding instead of the dataspace encoding.
+ </p>
+ <p>
+ This field is <em>not</em> padded with additional bytes.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Data</p></td>
+ <td><p>The raw data for the attribute. The size is
+ determined from the datatype and dataspace descriptions.</p>
+ <p>
+ This field is <em>not</em> padded with additional zero bytes.
+ </p></td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="CommentMessage">IV.A.2.n. The Object Comment
-Message</a></h4>
+<div align="center">
+ <table class="format">
+ <caption>Attribute Message (Version 3)</caption>
- <!-- start msgdesc table -->
- <center>
+ <tr align="center">
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td colspan="2">Name Size</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Datatype Size</td>
+ <td colspan="2">Dataspace Size</td>
+ </tr>
+
+ <tr>
+ <td>Name Character Set Encoding</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Name <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Datatype <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Dataspace <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Data <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number information is used for changes in
+ the format of the attribute message and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>Used by the library of version 1.8.x and after to encode
+ attribute messages. This version supports attributes with
+ non-ASCII names.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>This bit field contains extra information about
+ interpreting the attribute message:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set, datatype is shared.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>If set, dataspace is shared.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name Size</p></td>
+ <td><p>The length of the attribute name in bytes including
+ the null terminator.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Datatype Size</p></td>
+ <td><p>
+ The length of the datatype description in the <em>Datatype</em>
+ field below.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataspace Size</p></td>
+ <td><p>
+ The length of the dataspace description in the <em>Dataspace</em>
+ field below.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name Character Set Encoding</p></td>
+ <td><p>The character set encoding for the attribute&rsquo;s
+ name:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>ASCII character set encoding</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>UTF-8 character set encoding</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Name</p></td>
+ <td><p>
+ The null-terminated attribute name. This field is <em>not</em>
+ padded with additional bytes.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Datatype</p></td>
+ <td><p>The datatype description follows the same format as
+ described for the datatype object header message.</p>
+ <p>
+ If the <em>Flag</em> field indicates this attribute&rsquo;s
+ datatype is shared, this field will contain a &ldquo;shared
+ message&rdquo; encoding instead of the datatype encoding.
+ </p>
+ <p>
+ This field is <em>not</em> padded with additional bytes.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Dataspace</p></td>
+ <td><p>The dataspace description follows the same format as
+ described for the dataspace object header message.</p>
+ <p>
+ If the <em>Flag</em> field indicates this attribute&rsquo;s
+ dataspace is shared, this field will contain a &ldquo;shared
+ message&rdquo; encoding instead of the dataspace encoding.
+ </p>
+ <p>
+ This field is <em>not</em> padded with additional bytes.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Data</p></td>
+ <td><p>The raw data for the attribute. The size is
+ determined from the datatype and dataspace descriptions.</p>
+ <p>
+ This field is <em>not</em> padded with additional zero bytes.
+ </p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="CommentMessage">IV.A.2.n. The Object Comment Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Object
- Comment</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x000D</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>The object comment is designed to be a short description of
- an object. An object comment is a sequence of non-zero
- (<code>\0</code>) ASCII characters with no other formatting
- included by the library.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Name Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="4"><br />Comment <em>(variable size)</em><br /><br /></td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Object Comment</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x000D</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The object comment is designed to be a short description of
+ an object. An object comment is a sequence of non-zero (<code>\0</code>)
+ ASCII characters with no other formatting included by the library.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Name</p></td>
- <td><p>A null terminated ASCII character string.</p></td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Name Message</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Comment <em>(variable size)</em><br />
+ <br /></td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="OldModificationTimeMessage">IV.A.2.o. The Object
-Modification Time (Old) Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Name</p></td>
+ <td><p>A null terminated ASCII character string.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="OldModificationTimeMessage">IV.A.2.o. The Object
+ Modification Time (Old) Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Object
- Modification Time (Old)</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x000E</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td><p>The object modification date and time is a timestamp
- which indicates (using ISO-8601 date and time format) the last
- modification of an object. The time is updated when any object
- header message changes according to the system clock where the
- change was posted. All fields of this message should be
- interpreted as coordinated universal time (UTC).</p>
- <p>This modification time message is deprecated in favor of
- the &ldquo;new&rdquo; <a href="#ModificationTimeMessage">Object
- Modification Time</a> message and is no longer written to the
- file in versions of the HDF5 Library after the 1.6.0
- version.</p></td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Modification Time Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td colspan="4">Year</td>
- </tr>
-
- <tr>
- <td colspan="2">Month</td>
- <td colspan="2">Day of Month</td>
- </tr>
-
- <tr>
- <td colspan="2">Hour</td>
- <td colspan="2">Minute</td>
- </tr>
-
- <tr>
- <td colspan="2">Second</td>
- <td colspan="2">Reserved</td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Object Modification
+ Time (Old)</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x000E</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td><p>The object modification date and time is a timestamp
+ which indicates (using ISO-8601 date and time format) the last
+ modification of an object. The time is updated when any object
+ header message changes according to the system clock where the
+ change was posted. All fields of this message should be interpreted
+ as coordinated universal time (UTC).</p>
+ <p>
+ This modification time message is deprecated in favor of the
+ &ldquo;new&rdquo; <a href="#ModificationTimeMessage">Object
+ Modification Time</a> message and is no longer written to the file in
+ versions of the HDF5 Library after the 1.6.0 version.
+ </p></td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Year</p></td>
- <td><p>The four-digit year as an ASCII string. For example,
- <code>1998</code>.
- </p></td>
- </tr>
-
- <tr>
- <td><p>Month</p></td>
- <td><p>The month number as a two digit ASCII string where
- January is <code>01</code> and December is <code>12</code>.</p></td>
- </tr>
-
- <tr>
- <td><p>Day of Month</p></td>
- <td><p>The day number within the month as a two digit ASCII
- string. The first day of the month is <code>01</code>.</p></td>
- </tr>
-
- <tr>
- <td><p>Hour</p></td>
- <td><p>The hour of the day as a two digit ASCII string where
- midnight is <code>00</code> and 11:00pm is <code>23</code>.</p></td>
- </tr>
-
- <tr>
- <td><p>Minute</p></td>
- <td><p>The minute of the hour as a two digit ASCII string where
- the first minute of the hour is <code>00</code> and
- the last is <code>59</code>.</p></td>
- </tr>
-
- <tr>
- <td><p>Second</p></td>
- <td><p>The second of the minute as a two digit ASCII string
- where the first second of the minute is <code>00</code>
- and the last is <code>59</code>.</p></td>
- </tr>
-
- <tr>
- <td><p>Reserved</p></td>
- <td><p>This field is reserved and should always be zero.</p></td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Modification Time Message</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4">Year</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Month</td>
+ <td colspan="2">Day of Month</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Hour</td>
+ <td colspan="2">Minute</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Second</td>
+ <td colspan="2">Reserved</td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="SOHMTableMessage">IV.A.2.p. The Shared Message Table
-Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Year</p></td>
+ <td><p>
+ The four-digit year as an ASCII string. For example,
+ <code>1998</code>
+ .
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Month</p></td>
+ <td><p>
+ The month number as a two digit ASCII string where January is
+ <code>01</code>
+ and December is
+ <code>12</code>
+ .
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Day of Month</p></td>
+ <td><p>
+ The day number within the month as a two digit ASCII string. The
+ first day of the month is
+ <code>01</code>
+ .
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Hour</p></td>
+ <td><p>
+ The hour of the day as a two digit ASCII string where midnight is
+ <code>00</code>
+ and 11:00pm is
+ <code>23</code>
+ .
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Minute</p></td>
+ <td><p>
+ The minute of the hour as a two digit ASCII string where the first
+ minute of the hour is
+ <code>00</code>
+ and the last is
+ <code>59</code>
+ .
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Second</p></td>
+ <td><p>
+ The second of the minute as a two digit ASCII string where the
+ first second of the minute is
+ <code>00</code>
+ and the last is
+ <code>59</code>
+ .
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Reserved</p></td>
+ <td><p>This field is reserved and should always be zero.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="SOHMTableMessage">IV.A.2.p. The Shared Message Table
+ Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Shared Message
- Table</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x000F</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>This message is used to locate the table of shared object
- header message (SOHM) indexes. Each index consists of information
- to find the shared messages from either the heap or object header.
- This message is <em>only</em> found in the superblock
- extension.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Shared Message Table Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Shared Object Header Message Table Address<sup>O</sup><br /><br /></td>
- </tr>
-
- <tr>
- <td>Number of Indices</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Shared Message Table</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x000F</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>This message is used to locate the table of shared object
+ header message (SOHM) indexes. Each index consists of information to
+ find the shared messages from either the heap or object header. This
+ message is <em>only</em> found in the superblock extension.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- </table>
+<div align="center">
+ <table class="format">
+ <caption>Shared Message Table Message</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
- </div>
+ <tr>
+ <td>Version</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This document describes version 0.</p></td>
- </tr>
-
- <tr>
- <td><p>Shared Object Header Message Table Address</p></td>
- <td><p>This field is the address of the master table for shared
- object header message indexes.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Number of Indices</p></td>
- <td><p>This field is the number of indices in the master table.
- </p></td>
- </tr>
+ <tr>
+ <td colspan="4"><br />Shared Object Header Message Table
+ Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td>Number of Indices</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
+
+</div>
<br />
-<h4><a name="ContinuationMessage">IV.A.2.q. The Object Header
-Continuation Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This document
+ describes version 0.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Shared Object Header Message Table Address</p></td>
+ <td><p>This field is the address of the master table for
+ shared object header message indexes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Number of Indices</p></td>
+ <td><p>This field is the number of indices in the master
+ table.</p></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="ContinuationMessage">IV.A.2.q. The Object Header
+ Continuation Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Object Header
- Continuation</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0010</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>The object header continuation is the location in the file
- of a block containing more header messages for the current data
- object. This can be used when header blocks become too large or
- are likely to change over time.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Object Header Continuation Message
- </caption>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Object Header
+ Continuation</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0010</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The object header continuation is the location in the file
+ of a block containing more header messages for the current data
+ object. This can be used when header blocks become too large or are
+ likely to change over time.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
+
+<div align="center">
+ <table class="format">
+ <caption>Object Header Continuation Message</caption>
<tr>
- <th width=25%>byte</th>
- <th width=25%>byte</th>
- <th width=25%>byte</th>
- <th width=25%>byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
</tr>
<tr>
- <td colspan="4"><br />Offset<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Offset<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Length<sup>L</sup><br /><br /></td>
+ <td colspan="4"><br />Length<sup>L</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>Offset</p></td>
- <td><p>This value is the address in the file where the
- header continuation block is located.</p></td>
+ <td><p>Offset</p></td>
+ <td><p>This value is the address in the file where the
+ header continuation block is located.</p></td>
</tr>
<tr>
- <td><p>Length</p></td>
- <td><p>This value is the length in bytes of the header continuation
- block in the file.</p></td>
+ <td><p>Length</p></td>
+ <td><p>This value is the length in bytes of the header
+ continuation block in the file.</p></td>
</tr>
- </table>
- </div>
- <br />
+ </table>
+</div>
+<br />
- <p>The format of the header continuation block that this message points
- to depends on the version of the object header that the message is
- contained within.
- </p>
-
- <p>
- Continuation blocks for version 1 object headers have no special
- formatting information; they are merely a list of object header
- message info sequences (type, size, flags, reserved bytes and data
- for each message sequence). See the description
- of <a href="#V1ObjectHeaderPrefix">Version 1 Data Object Header Prefix.</a>
- </p>
-
- <p>Continuation blocks for version 2 object headers <em>do</em> have
- special formatting information as described here
- (see also the description of
- <a href="#V2ObjectHeaderPrefix">Version 2 Data Object Header Prefix.</a>):
- </p>
- <div align="center">
- <table class="format">
- <caption>
- Version 2 Object Header Continuation Block
- </caption>
-
- <tr>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- <th>byte</th>
- </tr>
-
- <tr>
- <td colspan="4">Signature</td>
- </tr>
- <tr>
- <td>Header Message Type #1</td>
- <td colspan="2">Size of Header Message Data #1</td>
- <td>Header Message #1 Flags</td>
- </tr>
-
- <tr>
- <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Header Message Data #1<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">.<br />.<br />.<br /></td>
- </tr>
-
- <tr>
- <td>Header Message Type #n</td>
- <td colspan="2">Size of Header Message Data #n</td>
- <td>Header Message #n Flags</td>
- </tr>
-
- <tr>
- <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br />Header Message Data #n<br /><br /></td>
- </tr>
-
- <tr>
- <td colspan="4">Gap <em>(optional, variable size)</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Checksum</td>
- </tr>
- </table>
- </div>
+<p>The format of the header continuation block that this message
+ points to depends on the version of the object header that the message
+ is contained within.</p>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Signature</p></td>
- <td>
- <p>The ASCII character string &ldquo;<code>OCHK</code>&rdquo;
- is used to indicate the
- beginning of an object header continuation block. This gives file
- consistency checking utilities a better chance of reconstructing a
- damaged file.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Type</p></td>
- <td>
- <p>Same format as version 1 of the object header, described above.
- </p></td>
- </tr>
-
- <tr>
- <td><p>Size of Header Message #n Data</p></td>
- <td>
- <p>Same format as version 1 of the object header, described above.
- </p></td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Flags</p></td>
- <td>
- <p>Same format as version 1 of the object header, described above.
- </p></td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Creation Order</p></td>
- <td>
- <p>This field stores the order that a message of a given type
- was created in.</p>
- <p>This field is present if bit 2 of <em>flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Header Message #n Data</p></td>
- <td>
- <p>Same format as version 1 of the object header, described above.
- </p></td>
- </tr>
-
- <tr>
- <td><p>Gap</p></td>
- <td>
- <p>A gap in an object header chunk is inferred by the end of the
- messages for the chunk before the beginning of the chunk&rsquo;s
- checksum. Gaps are always smaller than the size of an
- object header message prefix (message type + message size +
- message flags).</p>
- <p>Gaps are formed when a message (typically an attribute message)
- in an earlier chunk is deleted and a message from a later
- chunk that does not quite fit into the free space is moved
- into the earlier chunk.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Checksum</p></td>
- <td>
- <p>This is the checksum for the object header chunk.
- </p>
- </td>
+<p>
+ Continuation blocks for version 1 object headers have no special
+ formatting information; they are merely a list of object header message
+ info sequences (type, size, flags, reserved bytes and data for each
+ message sequence). See the description of <a
+ href="#V1ObjectHeaderPrefix">Version 1 Data Object Header Prefix.</a>
+</p>
+
+<p>
+ Continuation blocks for version 2 object headers <em>do</em> have
+ special formatting information as described here (see also the
+ description of <a href="#V2ObjectHeaderPrefix">Version 2 Data
+ Object Header Prefix.</a>):
+</p>
+<div align="center">
+ <table class="format">
+ <caption>Version 2 Object Header Continuation Block</caption>
+
+ <tr>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ <th>byte</th>
+ </tr>
+
+ <tr>
+ <td colspan="4">Signature</td>
+ </tr>
+ <tr>
+ <td>Header Message Type #1</td>
+ <td colspan="2">Size of Header Message Data #1</td>
+ <td>Header Message #1 Flags</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Header Message Data #1<br />
+ <br /></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">.<br />.<br />.<br /></td>
+ </tr>
+
+ <tr>
+ <td>Header Message Type #n</td>
+ <td colspan="2">Size of Header Message Data #n</td>
+ <td>Header Message #n Flags</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />Header Message Data #n<br />
+ <br /></td>
</tr>
- </table>
- </div>
+
+ <tr>
+ <td colspan="4">Gap <em>(optional, variable size)</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Checksum</td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="SymbolTableMessage">IV.A.2.r. The Symbol Table
-Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Signature</p></td>
+ <td>
+ <p>
+ The ASCII character string &ldquo;
+ <code>OCHK</code>
+ &rdquo; is used to indicate the beginning of an object header
+ continuation block. This gives file consistency checking utilities
+ a better chance of reconstructing a damaged file.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Type</p></td>
+ <td>
+ <p>Same format as version 1 of the object header, described
+ above.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Size of Header Message #n Data</p></td>
+ <td>
+ <p>Same format as version 1 of the object header, described
+ above.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Flags</p></td>
+ <td>
+ <p>Same format as version 1 of the object header, described
+ above.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Creation Order</p></td>
+ <td>
+ <p>This field stores the order that a message of a given type
+ was created in.</p>
+ <p>
+ This field is present if bit 2 of <em>flags</em> is set.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Header Message #n Data</p></td>
+ <td>
+ <p>Same format as version 1 of the object header, described
+ above.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Gap</p></td>
+ <td>
+ <p>A gap in an object header chunk is inferred by the end of the
+ messages for the chunk before the beginning of the chunk&rsquo;s
+ checksum. Gaps are always smaller than the size of an object header
+ message prefix (message type + message size + message flags).</p>
+ <p>Gaps are formed when a message (typically an attribute
+ message) in an earlier chunk is deleted and a message from a later
+ chunk that does not quite fit into the free space is moved into the
+ earlier chunk.</p>
+ </td>
+ </tr>
+
+ <tr>
+ <td><p>Checksum</p></td>
+ <td>
+ <p>This is the checksum for the object header chunk.</p>
+ </td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="SymbolTableMessage">IV.A.2.r. The Symbol Table Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Symbol Table
- Message</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0011</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Required for
- &ldquo;old style&rdquo; groups; may not be repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>Each &ldquo;old style&rdquo; group has a v1 B-tree and a
- local heap for storing symbol table entries, which are located
- with this message.</td></tr>
- <tr><td colspan="2"><b>Format of data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Symbol Table Message</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0011</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Required for &ldquo;old
+ style&rdquo; groups; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>Each &ldquo;old style&rdquo; group has a v1 B-tree and a
+ local heap for storing symbol table entries, which are located with
+ this message.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
+
+<div align="center">
+ <table class="format">
<caption>
- <b>Symbol Table Message</b>
+ <b>Symbol Table Message</b>
</caption>
<tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
</tr>
<tr>
- <td colspan="4"><br />v1 B-tree Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />v1 B-tree Address<sup>O</sup><br />
+ <br /></td>
</tr>
<tr>
- <td colspan="4"><br />Local Heap Address<sup>O</sup><br /><br /></td>
+ <td colspan="4"><br />Local Heap Address<sup>O</sup><br />
+ <br /></td>
</tr>
- </table>
+ </table>
- <table class="note">
+ <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
+<br />
+<div align="center">
+ <table class="desc">
<tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
</tr>
<tr>
- <td><p>v1 B-tree Address</p></td>
- <td><p>This value is the address of the v1 B-tree containing the
- symbol table entries for the group.</p></td>
+ <td><p>v1 B-tree Address</p></td>
+ <td><p>This value is the address of the v1 B-tree containing
+ the symbol table entries for the group.</p></td>
</tr>
<tr>
- <td><p>Local Heap Address</p></td>
- <td><p>This value is the address of the local heap containing
- the link names for the symbol table entries for the group.</p></td>
+ <td><p>Local Heap Address</p></td>
+ <td><p>This value is the address of the local heap
+ containing the link names for the symbol table entries for the
+ group.</p></td>
</tr>
- </table>
- </div>
+ </table>
+</div>
<br />
-<h4><a name="ModificationTimeMessage">IV.A.2.s. The Object
-Modification Time Message</a></h4>
+<h4>
+ <a name="ModificationTimeMessage">IV.A.2.s. The Object Modification
+ Time Message</a>
+</h4>
- <!-- start msgdesc table -->
- <center>
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Object
- Modification Time</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0012</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>The object modification time is a timestamp which indicates
- the time of the last modification of an object. The time is
- updated when any object header message changes according to
- the system clock where the change was posted.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Modification Time Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td colspan="3">Reserved (zero)</td>
- </tr>
-
- <tr>
- <td colspan="4">Seconds After UNIX Epoch</td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Object Modification
+ Time</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0012</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>The object modification time is a timestamp which indicates
+ the time of the last modification of an object. The time is updated
+ when any object header message changes according to the system clock
+ where the change was posted.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number is used for changes in the format of Object Modification Time
- and is described here:
- <table class="list">
- <tr>
- <th width="20%" align="center">Version</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>Never used.</td>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>Used by Version 1.6.1 and after of the library to encode time. In
- this version, the time is the seconds after Epoch.</td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Seconds After UNIX Epoch</p></td>
- <td><p>A 32-bit unsigned integer value that stores the number of
- seconds since 0 hours, 0 minutes, 0 seconds, January 1, 1970,
- Coordinated Universal Time.</p></td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Modification Time Message</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td colspan="3">Reserved (zero)</td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Seconds After UNIX Epoch</td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="BtreeKValuesMessage">IV.A.2.t. The B-tree
-&lsquo;K&rsquo; Values Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number is used for changes in the format
+ of Object Modification Time and is described here:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Version</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>Never used.</td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>Used by Version 1.6.1 and after of the library to encode
+ time. In this version, the time is the seconds after Epoch.</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Seconds After UNIX Epoch</p></td>
+ <td><p>A 32-bit unsigned integer value that stores the
+ number of seconds since 0 hours, 0 minutes, 0 seconds, January 1,
+ 1970, Coordinated Universal Time.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="BtreeKValuesMessage">IV.A.2.t. The B-tree &lsquo;K&rsquo;
+ Values Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> B-tree
- &lsquo;K&rsquo; Values</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0013</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>This message retrieves non-default &lsquo;K&rsquo; values
- for internal and leaf nodes of a group or indexed storage v1
- B-trees. This message is <em>only</em> found in the superblock
- extension.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- B-tree &lsquo;K&rsquo; Values Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td colspan="2">Indexed Storage Internal Node K</td>
- <td bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="2">Group Internal Node K</td>
- <td colspan="2">Group Leaf Node K</td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> B-tree
+ &lsquo;K&rsquo; Values</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0013</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>This message retrieves non-default &lsquo;K&rsquo; values
+ for internal and leaf nodes of a group or indexed storage v1
+ B-trees. This message is <em>only</em> found in the superblock
+ extension.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This document describes
- version 0.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Indexed Storage Internal Node K</p></td>
- <td><p>This is the node &lsquo;K&rsquo; value for each internal node of an
- indexed storage v1 B-tree. See the description of this field
- in version 0 and 1 of the superblock as well the section on
- v1 B-trees.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Group Internal Node K</p></td>
- <td><p>This is the node &lsquo;K&rsquo; value for each internal node of a group
- v1 B-tree. See the description of this field in version 0 and
- 1 of the superblock as well as the section on v1 B-trees.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Group Leaf Node K</p></td>
- <td><p>This is the node &lsquo;K&rsquo; value for each leaf node of a group v1
- B-tree. See the description of this field in version 0 and 1
- of the superblock as well as the section on v1 B-trees.
- </p>
- </td>
- </tr>
+<div align="center">
+ <table class="format">
+ <caption>B-tree &lsquo;K&rsquo; Values Message</caption>
- </table>
- </div>
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td colspan="2">Indexed Storage Internal Node K</td>
+ <td bgcolor="#DDDDDD"><em>This space inserted only to align
+ table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Group Internal Node K</td>
+ <td colspan="2">Group Leaf Node K</td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="DrvInfoMessage">IV.A.2.u. The Driver Info
-Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This document
+ describes version 0.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Indexed Storage Internal Node K</p></td>
+ <td><p>This is the node &lsquo;K&rsquo; value for each
+ internal node of an indexed storage v1 B-tree. See the description
+ of this field in version 0 and 1 of the superblock as well the
+ section on v1 B-trees.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Group Internal Node K</p></td>
+ <td><p>This is the node &lsquo;K&rsquo; value for each
+ internal node of a group v1 B-tree. See the description of this
+ field in version 0 and 1 of the superblock as well as the section
+ on v1 B-trees.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Group Leaf Node K</p></td>
+ <td><p>This is the node &lsquo;K&rsquo; value for each leaf
+ node of a group v1 B-tree. See the description of this field in
+ version 0 and 1 of the superblock as well as the section on v1
+ B-trees.</p></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="DrvInfoMessage">IV.A.2.u. The Driver Info Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Driver
- Info</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0014</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
-
- <tr><td>
- <b>Description:</b></td>
- <td>This message contains information needed by the file driver
- to reopen a file. This message is <em>only</em> found in the
- superblock extension: see the <a href="#SuperblockExt">
- &ldquo;Disk Format: Level 0C - Superblock Extension&rdquo;</a>
- section for more information. For more information on the fields
- in the driver info message, see the <a href="#DriverInfo">
- &ldquo;Disk Format : Level 0B - File Driver Info&rdquo;</a>
- section; those who use the multi and family file drivers will
- find this section particularly helpful.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Driver Info Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Driver Identification</td>
- </tr>
-
- <tr>
- <td colspan="2">Driver Information Size</td>
- <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4"><br /><br />Driver Information <em>(variable size)</em><br /><br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Driver Info</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0014</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
- </table>
- </div>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>This message contains information needed by the file driver
+ to reopen a file. This message is <em>only</em> found in the
+ superblock extension: see the <a href="#SuperblockExt">
+ &ldquo;Disk Format: Level 0C - Superblock Extension&rdquo;</a> section
+ for more information. For more information on the fields in the
+ driver info message, see the <a href="#DriverInfo"> &ldquo;Disk
+ Format : Level 0B - File Driver Info&rdquo;</a> section; those who use
+ the multi and family file drivers will find this section
+ particularly helpful.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This document describes
- version 0.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Driver Identification</p></td>
- <td><p>This is an eight-byte ASCII string without null termination which
- identifies the driver.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Driver Information Size</p></td>
- <td><p>The size in bytes of the <em>Driver Information</em> field of this
- message.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Driver Information</p></td>
- <td><p>Driver information is stored in a format defined by the file driver.</p>
- </td>
- </tr>
- </table>
- </div>
+<div align="center">
+ <table class="format">
+ <caption>Driver Info Message</caption>
+
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Driver Identification</td>
+ </tr>
+
+ <tr>
+ <td colspan="2">Driver Information Size</td>
+ <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4"><br />
+ <br />Driver Information <em>(variable size)</em><br />
+ <br />
+ <br /></td>
+ </tr>
+
+ </table>
+</div>
<br />
-<h4><a name="AinfoMessage">IV.A.2.v. The Attribute Info
-Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This document
+ describes version 0.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Driver Identification</p></td>
+ <td><p>This is an eight-byte ASCII string without null
+ termination which identifies the driver.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Driver Information Size</p></td>
+ <td><p>
+ The size in bytes of the <em>Driver Information</em> field of this
+ message.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Driver Information</p></td>
+ <td><p>Driver information is stored in a format defined by
+ the file driver.</p></td>
+ </tr>
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="AinfoMessage">IV.A.2.v. The Attribute Info Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Attribute
- Info</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0015</td></tr>
- <tr><td colspan="2"><b>Length:</b> Varies</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>This message stores information about the attributes on an
- object, such as the maximum creation index for the attributes
- created and the location of the attribute storage when the
- attributes are stored &ldquo;densely&rdquo;.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Attribute Info Message
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Flags</td>
- <td colspan="2">Maximum Creation Index <em>(optional)</em></td>
- </tr>
- <tr>
- <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Attribute Name v2 B-tree Address<sup>O</sup><br /><br /></td>
- </tr>
- <tr>
- <td colspan="4"><br />Attribute Creation Order v2 B-tree Address<sup>O</sup> <em>(optional)</em><br /><br /></td>
- </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Attribute Info</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0015</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Varies</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>This message stores information about the attributes on an
+ object, such as the maximum creation index for the attributes
+ created and the location of the attribute storage when the
+ attributes are stored &ldquo;densely&rdquo;.</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- </table>
+<div align="center">
+ <table class="format">
+ <caption>Attribute Info Message</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td>Flags</td>
+ <td colspan="2">Maximum Creation Index <em>(optional)</em></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Attribute Name v2 B-tree Address<sup>O</sup><br />
+ <br /></td>
+ </tr>
+ <tr>
+ <td colspan="4"><br />Attribute Creation Order v2 B-tree
+ Address<sup>O</sup> <em>(optional)</em><br />
+ <br /></td>
+ </tr>
- </div>
+ </table>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This document describes
- version 0.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Flags</p></td>
- <td><p>This is the attribute index information flag with the
- following definition:
-
- <table class="list">
- <tr>
- <th width="20%" align="center">Bit</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>0</code></td>
- <td>If set, creation order for attributes is tracked.
- </td>
- </tr>
- <tr>
- <td align="center"><code>1</code></td>
- <td>If set, creation order for attributes is indexed.
- </td>
- </tr>
- <tr>
- <td align="center"><code>2-7</code></td>
- <td>Reserved</td>
- </tr>
- </table></p>
-
- </td>
- </tr>
-
- <tr>
- <td><p>Maximum Creation Index</p></td>
- <td><p>The is the maximum creation order index value for the
- attributes on the object.</p>
- <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Fractal Heap Address</p></td>
- <td><p>This is the address of the fractal heap to store dense
- attributes.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Attribute Name v2 B-tree Address</p></td>
- <td><p>This is the address of the version 2 B-tree to index the
- names of densely stored attributes.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Attribute Creation Order v2 B-tree Address</p></td>
- <td><p>This is the address of the version 2 B-tree to index the
- creation order of densely stored attributes.</p>
- <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
- </td>
- </tr>
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ </table>
- </table>
- </div>
+</div>
<br />
-<h4><a name="RefCountMessage">IV.A.2.w. The Object Reference
-Count Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This document
+ describes version 0.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Flags</p></td>
+ <td><p>This is the attribute index information flag with the
+ following definition:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Bit</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>0</code></td>
+ <td>If set, creation order for attributes is tracked.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>If set, creation order for attributes is indexed.</td>
+ </tr>
+ <tr>
+ <td align="center"><code>2-7</code></td>
+ <td>Reserved</td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Maximum Creation Index</p></td>
+ <td><p>The is the maximum creation order index value for the
+ attributes on the object.</p>
+ <p>
+ This field is present if bit 0 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ <tr>
+ <td><p>Fractal Heap Address</p></td>
+ <td><p>This is the address of the fractal heap to store
+ dense attributes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Attribute Name v2 B-tree Address</p></td>
+ <td><p>This is the address of the version 2 B-tree to index
+ the names of densely stored attributes.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Attribute Creation Order v2 B-tree Address</p></td>
+ <td><p>This is the address of the version 2 B-tree to index
+ the creation order of densely stored attributes.</p>
+ <p>
+ This field is present if bit 1 of <em>Flags</em> is set.
+ </p></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="RefCountMessage">IV.A.2.w. The Object Reference Count
+ Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> Object Reference
- Count</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0016</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td><b>Description:</b></td>
- <td>This message stores the number of hard links (in groups or
- objects) pointing to an object: in other words, its
- <em>reference count</em>.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- Object Reference Count
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
- </tr>
-
- <tr>
- <td colspan="4">Reference count</td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> Object Reference
+ Count</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0016</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>This message stores the number of hard links (in groups or
+ objects) pointing to an object: in other words, its <em>reference
+ count</em>.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>The version number for this message. This document describes
- version 0.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Reference Count</p></td>
- <td><p>The unsigned 32-bit integer is the reference count for the
- object. This message is only present in &ldquo;version 2&rdquo;
- (or later) object headers, and if not present those object
- header versions, the reference count for the object is assumed
- to be 1.</p>
- </td>
- </tr>
+<div align="center">
+ <table class="format">
+ <caption>Object Reference Count</caption>
- </table>
- </div>
+ <tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
+ <tr>
+ <td>Version</td>
+ <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted
+ only to align table nicely</em></td>
+ </tr>
+
+ <tr>
+ <td colspan="4">Reference count</td>
+ </tr>
+ </table>
+</div>
<br />
-<h4><a name="FsinfoMessage">IV.A.2.x. The File Space Info
-Message</a></h4>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
- <!-- start msgdesc table -->
- <center>
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>The version number for this message. This document
+ describes version 0.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Reference Count</p></td>
+ <td><p>The unsigned 32-bit integer is the reference count
+ for the object. This message is only present in &ldquo;version
+ 2&rdquo; (or later) object headers, and if not present those object
+ header versions, the reference count for the object is assumed to
+ be 1.</p></td>
+ </tr>
+
+ </table>
+</div>
+
+<br />
+<h4>
+ <a name="FsinfoMessage">IV.A.2.x. The File Space Info Message</a>
+</h4>
+
+<!-- start msgdesc table -->
+<center>
<table class="msgdesc">
- <tr><td colspan="2"><b>Header Message Name:</b> File Space
- Info</td></tr>
- <tr><td colspan="2"><b>Header Message Type:</b> 0x0018</td></tr>
- <tr><td colspan="2"><b>Length:</b> Fixed</td></tr>
- <tr><td colspan="2"><b>Status:</b> Optional; may not be
- repeated.</td></tr>
- <tr><td>
- <b>Description:</b></td>
- <td>This message stores the file space management strategy (see
- description below) that the library uses in handling file space
- request for the file. It also contains the free-space section
- threshold used by the library&rsquo;s free-space managers for
- the file. If the strategy is 1, this message also contains the
- addresses of the file&rsquo;s free-space managers which track
- free space for each type of file space allocation. There are
- six basic types of file space allocation: superblock, B-tree,
- raw data, global heap, local heap, and object header. See the
- description of <a href="#FreeSpaceManager">Free-space
- Manager</a> as well the description of allocation types in
- <a href="#AppendixB">Appendix B</a>.</td></tr>
- <tr><td colspan="2"><b>Format of Data:</b> See the tables
- below.</td></tr>
- </table></center>
- <!-- end msgdesc table -->
-
- <div align="center">
- <table class="format">
- <caption>
- File Space Info
- </caption>
-
- <tr>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- <th width="25%">byte</th>
- </tr>
-
- <tr>
- <td>Version</td>
- <td>Strategy</td>
- <td colspan="2">Threshold<sup>L</sup></td>
- </tr>
- <tr>
- <td colspan="4">Super-block Free-space Manager Address<sup>O</sup></td>
- </tr>
- <tr>
- <td colspan="4">B-tree Free-space Manager Address<sup>O</sup></td>
- </tr>
- <tr>
- <td colspan="4">Raw Data Free-space Manager Address<sup>O</sup></td>
- </tr>
- <tr>
- <td colspan="4">Global Heap Free-space Manager Address<sup>O</sup></td>
- </tr>
- <tr>
- <td colspan="4">Local Heap Free-space Manager Address<sup>O</sup></td>
- </tr>
- <tr>
- <td colspan="4">Object Header Free-space Manager Address<sup>O</sup></td>
- </tr>
- </table>
+ <tr>
+ <td colspan="2"><b>Header Message Name:</b> File Space Info</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Header Message Type:</b> 0x0018</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Length:</b> Fixed</td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Status:</b> Optional; may not be repeated.</td>
+ </tr>
+ <tr>
+ <td><b>Description:</b></td>
+ <td>This message stores the file space management strategy (see
+ description below) that the library uses in handling file space
+ request for the file. It also contains the free-space section
+ threshold used by the library&rsquo;s free-space managers for the
+ file. If the strategy is 1, this message also contains the addresses
+ of the file&rsquo;s free-space managers which track free space for
+ each type of file space allocation. There are six basic types of
+ file space allocation: superblock, B-tree, raw data, global heap,
+ local heap, and object header. See the description of <a
+ href="#FreeSpaceManager">Free-space Manager</a> as well the
+ description of allocation types in <a href="#AppendixB">Appendix
+ B</a>.
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><b>Format of Data:</b> See the tables below.</td>
+ </tr>
+ </table>
+</center>
+<!-- end msgdesc table -->
+
+<div align="center">
+ <table class="format">
+ <caption>File Space Info</caption>
- <table class="note">
<tr>
- <td width="60%">&nbsp;</td>
- <td width="40%">
- (Items marked with an &lsquo;O&rsquo; in the above table are of the size
- specified in &ldquo;Size of Offsets&rdquo; field in the superblock.)
- </td></tr>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ <th width="25%">byte</th>
+ </tr>
+
<tr>
- <td>&nbsp;</td>
- <td>
- (Items marked with an &lsquo;L&rsquo; in the above table are of the size
- specified in &ldquo;Size of Lengths&rdquo; field in the superblock.)
- </td></tr>
- </table>
+ <td>Version</td>
+ <td>Strategy</td>
+ <td colspan="2">Threshold<sup>L</sup></td>
+ </tr>
+ <tr>
+ <td colspan="4">Super-block Free-space Manager Address<sup>O</sup></td>
+ </tr>
+ <tr>
+ <td colspan="4">B-tree Free-space Manager Address<sup>O</sup></td>
+ </tr>
+ <tr>
+ <td colspan="4">Raw Data Free-space Manager Address<sup>O</sup></td>
+ </tr>
+ <tr>
+ <td colspan="4">Global Heap Free-space Manager Address<sup>O</sup></td>
+ </tr>
+ <tr>
+ <td colspan="4">Local Heap Free-space Manager Address<sup>O</sup></td>
+ </tr>
+ <tr>
+ <td colspan="4">Object Header Free-space Manager Address<sup>O</sup></td>
+ </tr>
+ </table>
+
+ <table class="note">
+ <tr>
+ <td width="60%">&nbsp;</td>
+ <td width="40%">(Items marked with an &lsquo;O&rsquo; in the
+ above table are of the size specified in &ldquo;Size of
+ Offsets&rdquo; field in the superblock.)</td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td>(Items marked with an &lsquo;L&rsquo; in the above table are
+ of the size specified in &ldquo;Size of Lengths&rdquo; field in the
+ superblock.)</td>
+ </tr>
+ </table>
- </div>
+</div>
- <br />
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Field Name</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td><p>Version</p></td>
- <td><p>This is the version number of this message. This document describes
- version 0.</p>
- </td>
- </tr>
-
- <tr>
- <td><p>Strategy</p></td>
- <td><p>This is the file space management strategy for the file.
- There are four types of strategies:
- <table class="list">
- <tr>
- <th width="20%" align="center">Value</th>
- <th width="80%" align="left">Description</th>
- </tr>
-
- <tr>
- <td align="center"><code>1</code></td>
- <td>With this strategy, the HDF5 Library&rsquo;s free-space managers track the
- free space that results from the manipulation of HDF5 objects
- in the HDF5 file. The free space information is saved when the
- file is closed, and reloaded when the file is reopened.
- <br />
- When space is needed for file metadata or raw data,
- the HDF5 Library first requests space from the library&rsquo;s free-space
- managers. If the request is not satisfied, the library requests space
- from the aggregators. If the request is still not satisfied,
- the library requests space from the virtual file driver.
- That is, the library will use all of the mechanisms for allocating
- space.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>2</code></td>
- <td>This is the HDF5 Library&rsquo;s default file space management strategy.
- With this strategy, the library&rsquo;s free-space managers track the free space
- that results from the manipulation of HDF5 objects in the HDF5 file.
- The free space information is NOT saved when the file is closed and
- the free space that exists upon file closing becomes unaccounted
- space in the file.
- <br />
- As with strategy #1, the library will try all of the mechanisms
- for allocating space. When space is needed for file metadata or
- raw data, the library first requests space from the free-space
- managers. If the request is not satisfied, the library requests
- space from the aggregators. If the request is still not satisfied,
- the library requests space from the virtual file driver.
- </td>
- </tr>
-
- <tr>
- <td align="center"><code>3</code></td>
- <td>With this strategy, the HDF5 Library does not track free space that results
- from the manipulation of HDF5 objects in the HDF5 file and
- the free space becomes unaccounted space in the file.
- <br />
- When space is needed for file metadata or raw data,
- the library first requests space from the aggregators.
- If the request is not satisfied, the library requests space from
- the virtual file driver.
- </td>
- </tr>
- <tr>
- <td align="center"><code>4</code></td>
- <td>With this strategy, the HDF5 Library does not track free space that results
- from the manipulation of HDF5 objects in the HDF5 file and
- the free space becomes unaccounted space in the file.
- <br />
- When space is needed for file metadata or raw data,
- the library requests space from the virtual file driver.
- </td>
- </tr>
- </table></p>
- </td>
- </tr>
-
- <tr>
- <td><p>Threshold</p></td>
- <td><p>This is the free-space section threshold.
- The library&rsquo;s free-space managers will track only
- free-space sections with size greater than or equal to
- <em>threshold</em>. The default is to track free-space
- sections of all sizes.</p>
- </td>
- </tr>
- <tr>
- <td><p>Superblock Free-space Manager Address</p></td>
- <td><p>This is the address of the free-space manager for
- H5FD_MEM_SUPER allocation type.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>B-tree Free-space Manager Address</p></td>
- <td><p>This is the address of the free-space manager for
- H5FD_MEM_BTREE allocation type.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Raw Data Free-space Manager Address</p></td>
- <td><p>This is the address of the free-space manager for
- H5FD_MEM_DRAW allocation type.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Global Heap Free-space Manager Address</p></td>
- <td><p>This is the address of the free-space manager for
- H5FD_MEM_GHEAP allocation type.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Local Heap Free-space Manager Address</p></td>
- <td><p>This is the address of the free-space manager for
- H5FD_MEM_LHEAP allocation type.
- </p>
- </td>
- </tr>
-
- <tr>
- <td><p>Object Header Free-space Manager Address</p></td>
- <td><p>This is the address of the free-space manager for
- H5FD_MEM_OHDR allocation type.
- </p>
- </td>
- </tr>
- </table>
- </div>
- <br />
+<br />
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Field Name</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td><p>Version</p></td>
+ <td><p>This is the version number of this message. This
+ document describes version 0.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Strategy</p></td>
+ <td><p>This is the file space management strategy for the
+ file. There are four types of strategies:</p>
+ <table class="list">
+ <tr>
+ <th width="20%" align="center">Value</th>
+ <th width="80%" align="left">Description</th>
+ </tr>
+
+ <tr>
+ <td align="center"><code>1</code></td>
+ <td>With this strategy, the HDF5 Library&rsquo;s free-space
+ managers track the free space that results from the manipulation
+ of HDF5 objects in the HDF5 file. The free space information is
+ saved when the file is closed, and reloaded when the file is
+ reopened. <br /> When space is needed for file metadata or raw
+ data, the HDF5 Library first requests space from the
+ library&rsquo;s free-space managers. If the request is not
+ satisfied, the library requests space from the aggregators. If
+ the request is still not satisfied, the library requests space
+ from the virtual file driver. That is, the library will use all
+ of the mechanisms for allocating space.
+ </td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>2</code></td>
+ <td>This is the HDF5 Library&rsquo;s default file space
+ management strategy. With this strategy, the library&rsquo;s
+ free-space managers track the free space that results from the
+ manipulation of HDF5 objects in the HDF5 file. The free space
+ information is NOT saved when the file is closed and the free
+ space that exists upon file closing becomes unaccounted space in
+ the file. <br /> As with strategy #1, the library will try all
+ of the mechanisms for allocating space. When space is needed for
+ file metadata or raw data, the library first requests space from
+ the free-space managers. If the request is not satisfied, the
+ library requests space from the aggregators. If the request is
+ still not satisfied, the library requests space from the virtual
+ file driver.
+ </td>
+ </tr>
+
+ <tr>
+ <td align="center"><code>3</code></td>
+ <td>With this strategy, the HDF5 Library does not track free
+ space that results from the manipulation of HDF5 objects in the
+ HDF5 file and the free space becomes unaccounted space in the
+ file. <br /> When space is needed for file metadata or raw data,
+ the library first requests space from the aggregators. If the
+ request is not satisfied, the library requests space from the
+ virtual file driver.
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><code>4</code></td>
+ <td>With this strategy, the HDF5 Library does not track free
+ space that results from the manipulation of HDF5 objects in the
+ HDF5 file and the free space becomes unaccounted space in the
+ file. <br /> When space is needed for file metadata or raw data,
+ the library requests space from the virtual file driver.
+ </td>
+ </tr>
+ </table>
+ <p></p></td>
+ </tr>
+
+ <tr>
+ <td><p>Threshold</p></td>
+ <td><p>
+ This is the free-space section threshold. The library&rsquo;s
+ free-space managers will track only free-space sections with size
+ greater than or equal to <em>threshold</em>. The default is to
+ track free-space sections of all sizes.
+ </p></td>
+ </tr>
+ <tr>
+ <td><p>Superblock Free-space Manager Address</p></td>
+ <td><p>This is the address of the free-space manager for
+ H5FD_MEM_SUPER allocation type.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>B-tree Free-space Manager Address</p></td>
+ <td><p>This is the address of the free-space manager for
+ H5FD_MEM_BTREE allocation type.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Raw Data Free-space Manager Address</p></td>
+ <td><p>This is the address of the free-space manager for
+ H5FD_MEM_DRAW allocation type.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Global Heap Free-space Manager Address</p></td>
+ <td><p>This is the address of the free-space manager for
+ H5FD_MEM_GHEAP allocation type.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Local Heap Free-space Manager Address</p></td>
+ <td><p>This is the address of the free-space manager for
+ H5FD_MEM_LHEAP allocation type.</p></td>
+ </tr>
+
+ <tr>
+ <td><p>Object Header Free-space Manager Address</p></td>
+ <td><p>This is the address of the free-space manager for
+ H5FD_MEM_OHDR allocation type.</p></td>
+ </tr>
+ </table>
+</div>
+<br />
<br />
-<h3><a name="DataStorage">
-IV.B. Disk Format: Level 2B - Data Object Data Storage</a></h3>
+<h3>
+ <a name="DataStorage"> IV.B. Disk Format: Level 2B - Data Object
+ Data Storage</a>
+</h3>
<p>The data for an object is stored separately from its header
- information in the file and may not actually be located in the HDF5 file
- itself if the header indicates that the data is stored externally. The
- information for each record in the object is stored according to the
- dimensionality of the object (indicated in the dataspace header message).
- Multi-dimensional array data is stored in C order; in other words, the
- &ldquo;last&rdquo; dimension changes fastest.</p>
-
-<p>Data whose elements are composed of atomic datatypes are stored in IEEE
- format, unless they are specifically defined as being stored in a different
- machine format with the architecture-type information from the datatype
- header message. This means that each architecture will need to [potentially]
- byte-swap data values into the internal representation for that particular
- machine.</p>
-
-<p> Data with a variable-length datatype is stored in the global heap
- of the HDF5 file. Global heap identifiers are stored in the
- data object storage.</p>
-
-<p>Data whose elements are composed of reference datatypes are stored in
- several different ways depending on the particular reference type involved.
- Object pointers are just stored as the offset of the object header being
- pointed to with the size of the pointer being the same number of bytes as
- offsets in the file.</p>
+ information in the file and may not actually be located in the HDF5
+ file itself if the header indicates that the data is stored externally.
+ The information for each record in the object is stored according to
+ the dimensionality of the object (indicated in the dataspace header
+ message). Multi-dimensional array data is stored in C order; in other
+ words, the &ldquo;last&rdquo; dimension changes fastest.</p>
+
+<p>Data whose elements are composed of atomic datatypes are stored
+ in IEEE format, unless they are specifically defined as being stored in
+ a different machine format with the architecture-type information from
+ the datatype header message. This means that each architecture will
+ need to [potentially] byte-swap data values into the internal
+ representation for that particular machine.</p>
+
+<p>Data with a variable-length datatype is stored in the global heap
+ of the HDF5 file. Global heap identifiers are stored in the data object
+ storage.</p>
+
+<p>Data whose elements are composed of reference datatypes are
+ stored in several different ways depending on the particular reference
+ type involved. Object pointers are just stored as the offset of the
+ object header being pointed to with the size of the pointer being the
+ same number of bytes as offsets in the file.</p>
<p>Dataset region references are stored as a heap-ID which points to
-the following information within the file-heap: an offset of the object
-pointed to, number-type information (same format as header message),
-dimensionality information (same format as header message), sub-set start
-and end information (in other words, a coordinate location for each),
-and field start and end names (in other words, a [pointer to the] string
-indicating the first field included and a [pointer to the] string name
-for the last field). </p>
+ the following information within the file-heap: an offset of the object
+ pointed to, number-type information (same format as header message),
+ dimensionality information (same format as header message), sub-set
+ start and end information (in other words, a coordinate location for
+ each), and field start and end names (in other words, a [pointer to
+ the] string indicating the first field included and a [pointer to the]
+ string name for the last field).</p>
-<p>Data of a compound datatype is stored as a contiguous stream of the items
- in the structure, with each item formatted according to its datatype.</p>
+<p>Data of a compound datatype is stored as a contiguous stream of
+ the items in the structure, with each item formatted according to its
+ datatype.</p>
<br />
<br />
<hr />
-<h2><a name="AppendixA">
-V. Appendix A: Definitions</a></h2>
+<h2>
+ <a name="AppendixA"> V. Appendix A: Definitions</a>
+</h2>
-<p>Definitions of various terms used in this document are included in
-this section.</p>
+<p>Definitions of various terms used in this document are included
+ in this section.</p>
- <div align="center">
+<div align="center">
<table class="glossary">
- <tr>
- <th width="20%">Term</th>
- <th>Definition</th>
- </tr>
+ <tr>
+ <th width="20%">Term</th>
+ <th>Definition</th>
+ </tr>
- <tr>
- <td>Undefined Address</td>
- <td>The <a name="UndefinedAddress">undefined
- address</a> for a file is a file address with all bits
- set: in other words, <code>0xffff...ff</code>.</td>
- </tr>
+ <tr>
+ <td>Undefined Address</td>
+ <td>The <a name="UndefinedAddress">undefined address</a> for a
+ file is a file address with all bits set: in other words, <code>0xffff...ff</code>.
+ </td>
+ </tr>
- <tr>
- <td>Unlimited Size</td>
- <td>The <a name="UnlimitedDim">unlimited size</a>
- for a size is a value with all bits set: in other words,
- <code>0xffff...ff</code>.</td>
- </tr>
+ <tr>
+ <td>Unlimited Size</td>
+ <td>The <a name="UnlimitedDim">unlimited size</a> for a size is
+ a value with all bits set: in other words, <code>0xffff...ff</code>.
+ </td>
+ </tr>
</table>
- </div>
+</div>
<br />
<br />
<hr />
-<h2><a name="AppendixB">
-VI. Appendix B: File Memory Allocation Types</a></h2>
+<h2>
+ <a name="AppendixB"> VI. Appendix B: File Memory Allocation Types</a>
+</h2>
-<p>There are six basic types of file memory allocation as follows:
-</p>
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Basic Allocation Type</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td>H5FD_MEM_SUPER</td>
- <td>File memory allocated for <em>Superblock.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_BTREE</td>
- <td>File memory allocated for <em>B-tree.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_DRAW</td>
- <td>File memory allocated for raw data.</td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_GHEAP</td>
- <td>File memory allocated for <em>Global Heap.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_LHEAP</td>
- <td>File memory allocated for <em>Local Heap.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_OHDR</td>
- <td>File memory allocated for <em>Object Header.</em></td>
- </tr>
- </table>
- </div>
+<p>There are six basic types of file memory allocation as follows:</p>
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Basic Allocation Type</th>
+ <th>Description</th>
+ </tr>
-<p>There are other file memory allocation types that are mapped to the
-above six basic allocation types because they are similar in nature.
-The mapping is listed in the following table:
-</p>
+ <tr>
+ <td>H5FD_MEM_SUPER</td>
+ <td>File memory allocated for <em>Superblock.</em></td>
+ </tr>
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Basic Allocation Type</th>
- <th>Mapping of Allocation Types to Basic Allocation Types</th>
- </tr>
-
- <tr>
- <td>H5FD_MEM_SUPER</td>
- <td><em>none</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_BTREE</td>
- <td>H5FD_MEM_SOHM_INDEX</td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_DRAW</td>
- <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_GHEAP</td>
- <td><em>none</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_LHEAP</td>
- <td>H5FD_MEM_FHEAP_DBLOCK, H5FD_MEM_FSPACE_SINFO</td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_OHDR</td>
- <td>H5FD_MEM_FHEAP_HDR, H5FD_MEM_FHEAP_IBLOCK, H5FD_MEM_FSPACE_HDR, H5FD_MEM_SOHM_TABLE</td>
- </tr>
- </table>
- </div>
+ <tr>
+ <td>H5FD_MEM_BTREE</td>
+ <td>File memory allocated for <em>B-tree.</em></td>
+ </tr>
-<p>Allocation types that are mapped to basic allocation types are described below:
-</p>
+ <tr>
+ <td>H5FD_MEM_DRAW</td>
+ <td>File memory allocated for raw data.</td>
+ </tr>
- <div align="center">
- <table class="desc">
- <tr>
- <th width="30%">Allocation Type</th>
- <th>Description</th>
- </tr>
-
- <tr>
- <td>H5FD_MEM_FHEAP_HDR</td>
- <td>File memory allocated for <em>Fractal Heap Header.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_FHEAP_DBLOCK</td>
- <td>File memory allocated for <em>Fractal Heap Direct Blocks.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_FHEAP_IBLOCK</td>
- <td>File memory allocated for <em>Fractal Heap Indirect Blocks.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
- <td>File memory allocated for huge objects in the fractal heap.</td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_FSPACE_HDR</td>
- <td>File memory allocated for <em>Free-space Manager Header.</em></td>
- </tr>
-
- <tr>
- <td>H5FD_MEM_FSPACE_SINFO</td>
- <td>File memory allocated for <em>Free-space Section List</em> of the free-space manager.</td>
- </tr>
- <tr>
- <td>H5FD_MEM_SOHM_TABLE</td>
- <td>File memory allocated for <em>Shared Object Header Message Table.</em></td>
- </tr>
- <tr>
- <td>H5FD_MEM_SOHM_INDEX</td>
- <td>File memory allocated for <em>Shared Message Record List.</em></td>
- </tr>
- </table>
- </div>
-</body>
+ <tr>
+ <td>H5FD_MEM_GHEAP</td>
+ <td>File memory allocated for <em>Global Heap.</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_LHEAP</td>
+ <td>File memory allocated for <em>Local Heap.</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_OHDR</td>
+ <td>File memory allocated for <em>Object Header.</em></td>
+ </tr>
+ </table>
+</div>
+
+<p>There are other file memory allocation types that are mapped to
+ the above six basic allocation types because they are similar in
+ nature. The mapping is listed in the following table:</p>
+
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Basic Allocation Type</th>
+ <th>Mapping of Allocation Types to Basic Allocation Types</th>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_SUPER</td>
+ <td><em>none</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_BTREE</td>
+ <td>H5FD_MEM_SOHM_INDEX</td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_DRAW</td>
+ <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_GHEAP</td>
+ <td><em>none</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_LHEAP</td>
+ <td>H5FD_MEM_FHEAP_DBLOCK, H5FD_MEM_FSPACE_SINFO</td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_OHDR</td>
+ <td>H5FD_MEM_FHEAP_HDR, H5FD_MEM_FHEAP_IBLOCK,
+ H5FD_MEM_FSPACE_HDR, H5FD_MEM_SOHM_TABLE</td>
+ </tr>
+ </table>
+</div>
+
+<p>Allocation types that are mapped to basic allocation types are
+ described below:</p>
+
+<div align="center">
+ <table class="desc">
+ <tr>
+ <th width="30%">Allocation Type</th>
+ <th>Description</th>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_FHEAP_HDR</td>
+ <td>File memory allocated for <em>Fractal Heap Header.</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_FHEAP_DBLOCK</td>
+ <td>File memory allocated for <em>Fractal Heap Direct
+ Blocks.</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_FHEAP_IBLOCK</td>
+ <td>File memory allocated for <em>Fractal Heap Indirect
+ Blocks.</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
+ <td>File memory allocated for huge objects in the fractal heap.</td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_FSPACE_HDR</td>
+ <td>File memory allocated for <em>Free-space Manager
+ Header.</em></td>
+ </tr>
+
+ <tr>
+ <td>H5FD_MEM_FSPACE_SINFO</td>
+ <td>File memory allocated for <em>Free-space Section List</em>
+ of the free-space manager.
+ </td>
+ </tr>
+ <tr>
+ <td>H5FD_MEM_SOHM_TABLE</td>
+ <td>File memory allocated for <em>Shared Object Header
+ Message Table.</em></td>
+ </tr>
+ <tr>
+ <td>H5FD_MEM_SOHM_INDEX</td>
+ <td>File memory allocated for <em>Shared Message Record
+ List.</em></td>
+ </tr>
+ </table>
+</div>
+</head>
+<body></body>
</html>
diff --git a/doxygen/examples/H5.format.html b/doxygen/examples/H5.format.html
index 47e19bf..9134d35 100644
--- a/doxygen/examples/H5.format.html
+++ b/doxygen/examples/H5.format.html
@@ -418,7 +418,7 @@
<p>This document describes the lower-level data objects;
the higher-level objects and their properties are described
- in the <a href="UG/HDF5_Users_Guide-Responsive HTML5/index.html"><cite>HDF5 User&rsquo;s Guide</cite></a>.</p>
+ in the <a href="UG/HDF5_User_Guide-Responsive HTML5/index.html"><cite>HDF5 User Guide</cite></a>.</p>
<p>Three levels of information comprise the file format.
Level 0 contains basic information for identifying and
diff --git a/doxygen/examples/ThreadSafeLibrary.html b/doxygen/examples/ThreadSafeLibrary.html
index 97f7742..5824dc6 100644
--- a/doxygen/examples/ThreadSafeLibrary.html
+++ b/doxygen/examples/ThreadSafeLibrary.html
@@ -20,9 +20,9 @@ The following code is placed at the beginning of H5private.h:
</blockquote>
<p>
-<code>H5_HAVE_THREADSAFE</code> is defined when the HDF-5 library is
+<code>H5_HAVE_THREADSAFE</code> is defined when the HDF5 library is
compiled with the --enable-threadsafe configuration option. In general,
-code for the non-threadsafe version of HDF-5 library are placed within
+code for the non-threadsafe version of HDF5 library are placed within
the <code>#else</code> part of the conditional compilation. The exception
to this rule are the changes to the <code>FUNC_ENTER</code> (in
H5private.h), <code>HRETURN</code> and <code>HRETURN_ERROR</code> (in
@@ -438,7 +438,7 @@ described in Appendix D and may be found in <code>H5TS.c</code>.
<p>
Except where stated, all tests involve 16 simultaneous threads that make
-use of HDF-5 API calls without any explicit synchronization typically
+use of HDF5 API calls without any explicit synchronization typically
required in a non-threadsafe environment.
</p>
@@ -453,7 +453,7 @@ dataset's named value.
<p>
The main thread would join with all 16 threads and attempt to match the
-resulting HDF-5 file with expected results - that each dataset contains
+resulting HDF5 file with expected results - that each dataset contains
the correct value (0 for <i>zero</i>, 1 for <i>one</i> etc ...) and all
datasets were correctly created.
</p>
@@ -473,7 +473,7 @@ name.
<p>
The error stack implementation runs correctly if it reports 15 instances
-of the dataset name conflict error and finally generates a correct HDF-5
+of the dataset name conflict error and finally generates a correct HDF5
containing that single dataset. Each thread should report its own stack
of errors with a thread number associated with it.
</p>
diff --git a/doxygen/examples/core_menu.md b/doxygen/examples/core_menu.md
new file mode 100644
index 0000000..3fd7d11
--- /dev/null
+++ b/doxygen/examples/core_menu.md
@@ -0,0 +1,69 @@
+<b>Core Library</b>
+
+- @ref H5A "Attributes (H5A)"
+<br />
+HDF5 attribute is a small metadata object describing the nature and/or intended usage of a primary data object.
+
+- @ref H5D "Datasets (H5D)"
+<br />
+Manage HDF5 datasets, including the transfer of data between memory and disk and the description of dataset properties.
+
+- @ref H5S "Dataspaces (H5S)"
+<br />
+HDF5 dataspaces describe the shape of datasets in memory or in HDF5 files.
+
+- @ref H5T "Datatypes (H5T)"
+<br />
+HDF5 datatypes describe the element type of HDF5 datasets and attributes.
+
+- @ref H5E "Error Handling (H5E)"
+<br />
+HDF5 library error reporting.
+
+- @ref H5ES "Event Set (H5ES)"
+<br />
+HDF5 event set life cycle used with HDF5 VOL connectors that enable the asynchronous feature in HDF5.
+
+- @ref H5F "Files (H5F)"
+<br />
+Manage HDF5 files.
+
+- @ref H5Z "Filters (H5Z)"
+<br />
+Manage HDF5 user-defined filters
+
+- @ref H5G "Groups (H5G)"
+<br />
+Manage HDF5 groups.
+
+- @ref H5I "Identifiers (H5I)"
+<br />
+Manage identifiers defined by the HDF5 library.
+
+- @ref H5 "Library General (H5)"
+<br />
+Manage the life cycle of HDF5 library instances.
+
+- @ref H5L "Links (H5L)"
+<br />
+Manage HDF5 links and link types.
+
+- @ref H5O "Objects (H5O)"
+<br />
+Manage HDF5 objects (groups, datasets, datatype objects).
+
+- @ref H5P "Property Lists (H5P)"
+<br />
+HDF5 property lists are the main vehicle to configure the behavior of HDF5 API functions.
+
+- @ref H5PL "Dynamically-loaded Plugins (H5PL)"
+<br />
+Manage the loading behavior of HDF5 plugins.
+
+- @ref H5R "References (H5R)"
+<br />
+Manage HDF5 references (HDF5 objects, attributes, and selections on datasets a.k.a. dataset regions).
+
+- @ref H5VL "VOL Connector (H5VL)"
+<br />
+Manage HDF5 VOL connector plugins.
diff --git a/doxygen/examples/fortran_menu.md b/doxygen/examples/fortran_menu.md
new file mode 100644
index 0000000..8ef4ead
--- /dev/null
+++ b/doxygen/examples/fortran_menu.md
@@ -0,0 +1,73 @@
+<b>Fortran Library</b>
+
+- @ref FH5A "Attributes (H5A)"
+<br />
+HDF5 attribute is a small metadata object describing the nature and/or intended usage of a primary data object.
+
+- @ref FH5D "Datasets (H5D)"
+<br />
+Manage HDF5 datasets, including the transfer of data between memory and disk and the description of dataset properties.
+
+- @ref FH5S "Dataspaces (H5S)"
+<br />
+HDF5 dataspaces describe the shape of datasets in memory or in HDF5 files.
+
+- @ref FH5T "Datatypes (H5T)"
+<br />
+HDF5 datatypes describe the element type of HDF5 datasets and attributes.
+
+- @ref FH5E "Error Handling (H5E)"
+<br />
+HDF5 library error reporting.
+
+- @ref FH5F "Files (H5F)"
+<br />
+Manage HDF5 files.
+
+- @ref FH5Z "Filters (H5Z)"
+<br />
+Manage HDF5 user-defined filters
+
+- @ref FH5G "Groups (H5G)"
+<br />
+Manage HDF5 groups.
+
+- @ref FH5I "Identifiers (H5I)"
+<br />
+Manage identifiers defined by the HDF5 library.
+
+- @ref FH5 "Library General (H5)"
+<br />
+Manage the life cycle of HDF5 library instances.
+
+- @ref FH5L "Links (H5L)"
+<br />
+Manage HDF5 links and link types.
+
+- @ref FH5O "Objects (H5O)"
+<br />
+Manage HDF5 objects (groups, datasets, datatype objects).
+
+- @ref FH5P "Property Lists (H5P)"
+<br />
+HDF5 property lists are the main vehicle to configure the behavior of HDF5 API functions.
+
+- @ref FH5R "References (H5R)"
+<br />
+Manage HDF5 references (HDF5 objects, attributes, and selections on datasets a.k.a. dataset regions).
+
+- @ref FH5LT "High Level Lite (H5LT)"
+<br />
+Functions to simplify creating and manipulating datasets, attributes and other features
+
+- @ref FH5IM "High Level Image (H5IM)"
+<br />
+Creating and manipulating HDF5 datasets intended to be interpreted as images
+
+- @ref FH5TB "High Level Table (H5TB)"
+<br />
+Creating and manipulating HDF5 datasets intended to be interpreted as tables
+
+- @ref FH5DS "High Level Dimension Scale (H5DS)"
+<br />
+Creating and manipulating HDF5 datasets that are associated with the dimension of another HDF5 dataset
diff --git a/doxygen/examples/high_level_menu.md b/doxygen/examples/high_level_menu.md
new file mode 100644
index 0000000..d209bf4
--- /dev/null
+++ b/doxygen/examples/high_level_menu.md
@@ -0,0 +1,30 @@
+<b>High-level library</b>
+<br />
+The high-level HDF5 library includes several sets of convenience and standard-use APIs to
+facilitate common HDF5 operations.
+
+- @ref H5LT
+<br />
+Functions to simplify creating and manipulating datasets, attributes and other features
+
+- @ref H5IM
+<br />
+Creating and manipulating HDF5 datasets intended to be interpreted as images
+
+- @ref H5TB
+<br />
+Creating and manipulating HDF5 datasets intended to be interpreted as tables
+
+- @ref H5PT
+<br />
+Creating and manipulating HDF5 datasets to support append- and read-only operations on table data
+
+- @ref H5DS
+<br />
+Creating and manipulating HDF5 datasets that are associated with the dimension of another HDF5 dataset
+
+- @ref H5DO
+<br />
+Bypassing default HDF5 behavior in order to optimize for specific use cases
+
+- @ref H5LR "Extensions (H5LR, H5LT)"
diff --git a/doxygen/examples/java_menu.md b/doxygen/examples/java_menu.md
new file mode 100644
index 0000000..1236838
--- /dev/null
+++ b/doxygen/examples/java_menu.md
@@ -0,0 +1,84 @@
+<b>Java Library</b>
+ @ref HDF5LIB
+
+- @ref JH5
+<br />
+This package is the Java interface for the HDF5 library.
+
+- @ref JH5A
+<br />
+This package is the Java interface for the HDF5 library attribute APIs.
+
+- @ref JH5D
+<br />
+This package is the Java interface for the HDF5 library dataset APIs.
+
+- @ref JH5S
+<br />
+This package is the Java interface for the HDF5 library dataspace APIs.
+
+- @ref JH5T
+<br />
+This package is the Java interface for the HDF5 library datatype APIs.
+
+- @ref JH5E
+<br />
+This package is the Java interface for the HDF5 library error APIs.
+
+- @ref JH5F
+<br />
+This package is the Java interface for the HDF5 library file APIs.
+
+- @ref JH5Z
+<br />
+This package is the Java interface for the HDF5 library filter APIs.
+
+- @ref JH5G
+<br />
+This package is the Java interface for the HDF5 library group APIs.
+
+- @ref JH5I
+<br />
+This package is the Java interface for the HDF5 library identifier APIs.
+
+- @ref JH5L
+<br />
+This package is the Java interface for the HDF5 library links APIs.
+
+- @ref JH5O
+<br />
+This package is the Java interface for the HDF5 library object APIs.
+
+- @ref JH5P
+<br />
+This package is the Java interface for the HDF5 library property list APIs.
+
+- @ref JH5PL
+<br />
+This package is the Java interface for the HDF5 library plugin APIs.
+
+- @ref JH5R
+<br />
+This package is the Java interface for the HDF5 library reference APIs.
+
+- @ref JH5VL
+<br />
+This package is the Java interface for the HDF5 library VOL connector APIs.
+
+- @ref HDF5CONST
+<br />
+This class contains C constants and enumerated types of HDF5 library.
+
+- @ref HDFNATIVE
+<br />
+This class encapsulates native methods to deal with arrays of numbers,
+ * converting from numbers to bytes and bytes to numbers.
+
+- @ref HDFARRAY
+<br />
+This is a class for handling multidimensional arrays for HDF.
+
+- @ref ERRORS
+<br />
+The class HDF5Exception returns errors from the Java HDF5 Interface.
+ \ No newline at end of file
diff --git a/doxygen/hdf5doxy_layout.xml b/doxygen/hdf5doxy_layout.xml
index 24642b5..f7c47bf 100644
--- a/doxygen/hdf5doxy_layout.xml
+++ b/doxygen/hdf5doxy_layout.xml
@@ -3,8 +3,9 @@
<!-- Navigation index tabs for HTML output -->
<navindex>
<tab type="user" url="index.html" title="Overview" />
- <tab type="user" url="https://portal.hdfgroup.org/display/HDF5/Learning+HDF5" title="Getting started" />
+ <tab type="user" url="@ref GettingStarted" title="Getting started" />
<tab type="user" url="@ref Cookbook" title="Cookbook" />
+ <tab type="user" url="@ref UG" title="User Guide" />
<tab type="user" url="https://portal.hdfgroup.org/display/HDF5/HDF5+User+Guides" title="User Guides" />
<tab type="user" url="https://portal.hdfgroup.org/display/HDF5/HDF5+Application+Developer%27s+Guide" title="Application Developer's Guide" />
<tab type="user" url="@ref GLS" title="Glossary" />
diff --git a/doxygen/img/DataGroup.png b/doxygen/img/DataGroup.png
new file mode 100644
index 0000000..4edeba3
--- /dev/null
+++ b/doxygen/img/DataGroup.png
Binary files differ
diff --git a/doxygen/img/Dmodel_fig1.gif b/doxygen/img/Dmodel_fig1.gif
new file mode 100644
index 0000000..ca8093c
--- /dev/null
+++ b/doxygen/img/Dmodel_fig1.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig10.gif b/doxygen/img/Dmodel_fig10.gif
new file mode 100644
index 0000000..c6a9916
--- /dev/null
+++ b/doxygen/img/Dmodel_fig10.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig11_b.gif b/doxygen/img/Dmodel_fig11_b.gif
new file mode 100644
index 0000000..19ea9fb
--- /dev/null
+++ b/doxygen/img/Dmodel_fig11_b.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig12_a.gif b/doxygen/img/Dmodel_fig12_a.gif
new file mode 100644
index 0000000..1f597df
--- /dev/null
+++ b/doxygen/img/Dmodel_fig12_a.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig12_b.gif b/doxygen/img/Dmodel_fig12_b.gif
new file mode 100644
index 0000000..f271082
--- /dev/null
+++ b/doxygen/img/Dmodel_fig12_b.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig14_a.gif b/doxygen/img/Dmodel_fig14_a.gif
new file mode 100644
index 0000000..45d6c6c
--- /dev/null
+++ b/doxygen/img/Dmodel_fig14_a.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig14_b.gif b/doxygen/img/Dmodel_fig14_b.gif
new file mode 100644
index 0000000..12a667d
--- /dev/null
+++ b/doxygen/img/Dmodel_fig14_b.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig14_c.gif b/doxygen/img/Dmodel_fig14_c.gif
new file mode 100644
index 0000000..0c06049
--- /dev/null
+++ b/doxygen/img/Dmodel_fig14_c.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig14_d.gif b/doxygen/img/Dmodel_fig14_d.gif
new file mode 100644
index 0000000..7cb8956
--- /dev/null
+++ b/doxygen/img/Dmodel_fig14_d.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig2.gif b/doxygen/img/Dmodel_fig2.gif
new file mode 100644
index 0000000..c2c9d04
--- /dev/null
+++ b/doxygen/img/Dmodel_fig2.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig3_a.gif b/doxygen/img/Dmodel_fig3_a.gif
new file mode 100644
index 0000000..9f00832
--- /dev/null
+++ b/doxygen/img/Dmodel_fig3_a.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig3_c.gif b/doxygen/img/Dmodel_fig3_c.gif
new file mode 100644
index 0000000..8529181
--- /dev/null
+++ b/doxygen/img/Dmodel_fig3_c.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig4_a.gif b/doxygen/img/Dmodel_fig4_a.gif
new file mode 100644
index 0000000..c7fdce1
--- /dev/null
+++ b/doxygen/img/Dmodel_fig4_a.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig4_b.gif b/doxygen/img/Dmodel_fig4_b.gif
new file mode 100644
index 0000000..34053d5
--- /dev/null
+++ b/doxygen/img/Dmodel_fig4_b.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig5.gif b/doxygen/img/Dmodel_fig5.gif
new file mode 100644
index 0000000..69e11f5
--- /dev/null
+++ b/doxygen/img/Dmodel_fig5.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig6.gif b/doxygen/img/Dmodel_fig6.gif
new file mode 100644
index 0000000..bf677c2
--- /dev/null
+++ b/doxygen/img/Dmodel_fig6.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig7_b.gif b/doxygen/img/Dmodel_fig7_b.gif
new file mode 100644
index 0000000..da27fa0
--- /dev/null
+++ b/doxygen/img/Dmodel_fig7_b.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig8.gif b/doxygen/img/Dmodel_fig8.gif
new file mode 100644
index 0000000..27305a8
--- /dev/null
+++ b/doxygen/img/Dmodel_fig8.gif
Binary files differ
diff --git a/doxygen/img/Dmodel_fig9.gif b/doxygen/img/Dmodel_fig9.gif
new file mode 100644
index 0000000..31893bf
--- /dev/null
+++ b/doxygen/img/Dmodel_fig9.gif
Binary files differ
diff --git a/doxygen/img/Dsets_NbitFloating1.gif b/doxygen/img/Dsets_NbitFloating1.gif
new file mode 100644
index 0000000..3d3ce19
--- /dev/null
+++ b/doxygen/img/Dsets_NbitFloating1.gif
Binary files differ
diff --git a/doxygen/img/Dsets_NbitFloating2.gif b/doxygen/img/Dsets_NbitFloating2.gif
new file mode 100644
index 0000000..cdb5a90
--- /dev/null
+++ b/doxygen/img/Dsets_NbitFloating2.gif
Binary files differ
diff --git a/doxygen/img/Dsets_NbitInteger1.gif b/doxygen/img/Dsets_NbitInteger1.gif
new file mode 100644
index 0000000..656fb8d
--- /dev/null
+++ b/doxygen/img/Dsets_NbitInteger1.gif
Binary files differ
diff --git a/doxygen/img/Dsets_NbitInteger2.gif b/doxygen/img/Dsets_NbitInteger2.gif
new file mode 100644
index 0000000..e100ebe
--- /dev/null
+++ b/doxygen/img/Dsets_NbitInteger2.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig1.gif b/doxygen/img/Dsets_fig1.gif
new file mode 100644
index 0000000..c8f3349
--- /dev/null
+++ b/doxygen/img/Dsets_fig1.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig10.gif b/doxygen/img/Dsets_fig10.gif
new file mode 100644
index 0000000..4593cc1
--- /dev/null
+++ b/doxygen/img/Dsets_fig10.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig11.gif b/doxygen/img/Dsets_fig11.gif
new file mode 100644
index 0000000..573701a
--- /dev/null
+++ b/doxygen/img/Dsets_fig11.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig12.gif b/doxygen/img/Dsets_fig12.gif
new file mode 100644
index 0000000..d9ddd2b
--- /dev/null
+++ b/doxygen/img/Dsets_fig12.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig2.gif b/doxygen/img/Dsets_fig2.gif
new file mode 100644
index 0000000..8ecc2c7
--- /dev/null
+++ b/doxygen/img/Dsets_fig2.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig3.gif b/doxygen/img/Dsets_fig3.gif
new file mode 100644
index 0000000..642715e
--- /dev/null
+++ b/doxygen/img/Dsets_fig3.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig4.gif b/doxygen/img/Dsets_fig4.gif
new file mode 100644
index 0000000..a24ccc9
--- /dev/null
+++ b/doxygen/img/Dsets_fig4.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig5.gif b/doxygen/img/Dsets_fig5.gif
new file mode 100644
index 0000000..78c953e
--- /dev/null
+++ b/doxygen/img/Dsets_fig5.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig6.gif b/doxygen/img/Dsets_fig6.gif
new file mode 100644
index 0000000..ea15564
--- /dev/null
+++ b/doxygen/img/Dsets_fig6.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig7.gif b/doxygen/img/Dsets_fig7.gif
new file mode 100644
index 0000000..f7f6b9e
--- /dev/null
+++ b/doxygen/img/Dsets_fig7.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig8.gif b/doxygen/img/Dsets_fig8.gif
new file mode 100644
index 0000000..91cb6aa
--- /dev/null
+++ b/doxygen/img/Dsets_fig8.gif
Binary files differ
diff --git a/doxygen/img/Dsets_fig9.gif b/doxygen/img/Dsets_fig9.gif
new file mode 100644
index 0000000..802ca52
--- /dev/null
+++ b/doxygen/img/Dsets_fig9.gif
Binary files differ
diff --git a/doxygen/img/Dspace_CvsF1.gif b/doxygen/img/Dspace_CvsF1.gif
new file mode 100644
index 0000000..716b9f1
--- /dev/null
+++ b/doxygen/img/Dspace_CvsF1.gif
Binary files differ
diff --git a/doxygen/img/Dspace_CvsF2.gif b/doxygen/img/Dspace_CvsF2.gif
new file mode 100644
index 0000000..716b9f1
--- /dev/null
+++ b/doxygen/img/Dspace_CvsF2.gif
Binary files differ
diff --git a/doxygen/img/Dspace_CvsF3.gif b/doxygen/img/Dspace_CvsF3.gif
new file mode 100644
index 0000000..59c31ff
--- /dev/null
+++ b/doxygen/img/Dspace_CvsF3.gif
Binary files differ
diff --git a/doxygen/img/Dspace_CvsF4.gif b/doxygen/img/Dspace_CvsF4.gif
new file mode 100644
index 0000000..e97b006
--- /dev/null
+++ b/doxygen/img/Dspace_CvsF4.gif
Binary files differ
diff --git a/doxygen/img/Dspace_combine.gif b/doxygen/img/Dspace_combine.gif
new file mode 100644
index 0000000..8da2397
--- /dev/null
+++ b/doxygen/img/Dspace_combine.gif
Binary files differ
diff --git a/doxygen/img/Dspace_complex.gif b/doxygen/img/Dspace_complex.gif
new file mode 100644
index 0000000..53e92ee
--- /dev/null
+++ b/doxygen/img/Dspace_complex.gif
Binary files differ
diff --git a/doxygen/img/Dspace_features.gif b/doxygen/img/Dspace_features.gif
new file mode 100644
index 0000000..d94b4e4
--- /dev/null
+++ b/doxygen/img/Dspace_features.gif
Binary files differ
diff --git a/doxygen/img/Dspace_features_cmpd.gif b/doxygen/img/Dspace_features_cmpd.gif
new file mode 100644
index 0000000..f24ee99
--- /dev/null
+++ b/doxygen/img/Dspace_features_cmpd.gif
Binary files differ
diff --git a/doxygen/img/Dspace_move.gif b/doxygen/img/Dspace_move.gif
new file mode 100644
index 0000000..5debd75
--- /dev/null
+++ b/doxygen/img/Dspace_move.gif
Binary files differ
diff --git a/doxygen/img/Dspace_point.gif b/doxygen/img/Dspace_point.gif
new file mode 100644
index 0000000..92ad3a8
--- /dev/null
+++ b/doxygen/img/Dspace_point.gif
Binary files differ
diff --git a/doxygen/img/Dspace_read.gif b/doxygen/img/Dspace_read.gif
new file mode 100644
index 0000000..28c67f4
--- /dev/null
+++ b/doxygen/img/Dspace_read.gif
Binary files differ
diff --git a/doxygen/img/Dspace_select.gif b/doxygen/img/Dspace_select.gif
new file mode 100644
index 0000000..b9f4851
--- /dev/null
+++ b/doxygen/img/Dspace_select.gif
Binary files differ
diff --git a/doxygen/img/Dspace_separate.gif b/doxygen/img/Dspace_separate.gif
new file mode 100644
index 0000000..ba4ba8c
--- /dev/null
+++ b/doxygen/img/Dspace_separate.gif
Binary files differ
diff --git a/doxygen/img/Dspace_simple.gif b/doxygen/img/Dspace_simple.gif
new file mode 100644
index 0000000..ff3eca5
--- /dev/null
+++ b/doxygen/img/Dspace_simple.gif
Binary files differ
diff --git a/doxygen/img/Dspace_subset.gif b/doxygen/img/Dspace_subset.gif
new file mode 100644
index 0000000..b353175
--- /dev/null
+++ b/doxygen/img/Dspace_subset.gif
Binary files differ
diff --git a/doxygen/img/Dspace_three_datasets.gif b/doxygen/img/Dspace_three_datasets.gif
new file mode 100644
index 0000000..4af222f
--- /dev/null
+++ b/doxygen/img/Dspace_three_datasets.gif
Binary files differ
diff --git a/doxygen/img/Dspace_transfer.gif b/doxygen/img/Dspace_transfer.gif
new file mode 100644
index 0000000..7de0231
--- /dev/null
+++ b/doxygen/img/Dspace_transfer.gif
Binary files differ
diff --git a/doxygen/img/Dspace_write1to2.gif b/doxygen/img/Dspace_write1to2.gif
new file mode 100644
index 0000000..5735bc7
--- /dev/null
+++ b/doxygen/img/Dspace_write1to2.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig1.gif b/doxygen/img/Dtypes_fig1.gif
new file mode 100644
index 0000000..484f54f
--- /dev/null
+++ b/doxygen/img/Dtypes_fig1.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig10.gif b/doxygen/img/Dtypes_fig10.gif
new file mode 100644
index 0000000..60c8ba9
--- /dev/null
+++ b/doxygen/img/Dtypes_fig10.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig11.gif b/doxygen/img/Dtypes_fig11.gif
new file mode 100644
index 0000000..b5eda71
--- /dev/null
+++ b/doxygen/img/Dtypes_fig11.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig12.gif b/doxygen/img/Dtypes_fig12.gif
new file mode 100644
index 0000000..ee911b7
--- /dev/null
+++ b/doxygen/img/Dtypes_fig12.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig13a.gif b/doxygen/img/Dtypes_fig13a.gif
new file mode 100644
index 0000000..2f47b71
--- /dev/null
+++ b/doxygen/img/Dtypes_fig13a.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig13b.gif b/doxygen/img/Dtypes_fig13b.gif
new file mode 100644
index 0000000..fe3b5fb
--- /dev/null
+++ b/doxygen/img/Dtypes_fig13b.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig13c.gif b/doxygen/img/Dtypes_fig13c.gif
new file mode 100644
index 0000000..afd2834
--- /dev/null
+++ b/doxygen/img/Dtypes_fig13c.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig13d.gif b/doxygen/img/Dtypes_fig13d.gif
new file mode 100644
index 0000000..48805d8
--- /dev/null
+++ b/doxygen/img/Dtypes_fig13d.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig14.gif b/doxygen/img/Dtypes_fig14.gif
new file mode 100644
index 0000000..8f4d787
--- /dev/null
+++ b/doxygen/img/Dtypes_fig14.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig15.gif b/doxygen/img/Dtypes_fig15.gif
new file mode 100644
index 0000000..82a34d0
--- /dev/null
+++ b/doxygen/img/Dtypes_fig15.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig16.gif b/doxygen/img/Dtypes_fig16.gif
new file mode 100644
index 0000000..e83d379
--- /dev/null
+++ b/doxygen/img/Dtypes_fig16.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig16a.gif b/doxygen/img/Dtypes_fig16a.gif
new file mode 100644
index 0000000..7e68cc0
--- /dev/null
+++ b/doxygen/img/Dtypes_fig16a.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig16b.gif b/doxygen/img/Dtypes_fig16b.gif
new file mode 100644
index 0000000..b7919be
--- /dev/null
+++ b/doxygen/img/Dtypes_fig16b.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig16c.gif b/doxygen/img/Dtypes_fig16c.gif
new file mode 100644
index 0000000..cca285a
--- /dev/null
+++ b/doxygen/img/Dtypes_fig16c.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig16d.gif b/doxygen/img/Dtypes_fig16d.gif
new file mode 100644
index 0000000..8ca0fd7
--- /dev/null
+++ b/doxygen/img/Dtypes_fig16d.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig17a.gif b/doxygen/img/Dtypes_fig17a.gif
new file mode 100644
index 0000000..cdfaa29
--- /dev/null
+++ b/doxygen/img/Dtypes_fig17a.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig17b.gif b/doxygen/img/Dtypes_fig17b.gif
new file mode 100644
index 0000000..4a3ba33
--- /dev/null
+++ b/doxygen/img/Dtypes_fig17b.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig18.gif b/doxygen/img/Dtypes_fig18.gif
new file mode 100644
index 0000000..73c33e0
--- /dev/null
+++ b/doxygen/img/Dtypes_fig18.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig19.gif b/doxygen/img/Dtypes_fig19.gif
new file mode 100644
index 0000000..38ea6d4
--- /dev/null
+++ b/doxygen/img/Dtypes_fig19.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig2.gif b/doxygen/img/Dtypes_fig2.gif
new file mode 100644
index 0000000..52285a6
--- /dev/null
+++ b/doxygen/img/Dtypes_fig2.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig20a.gif b/doxygen/img/Dtypes_fig20a.gif
new file mode 100644
index 0000000..8406e77
--- /dev/null
+++ b/doxygen/img/Dtypes_fig20a.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig20b.gif b/doxygen/img/Dtypes_fig20b.gif
new file mode 100644
index 0000000..3f2331d
--- /dev/null
+++ b/doxygen/img/Dtypes_fig20b.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig20c.gif b/doxygen/img/Dtypes_fig20c.gif
new file mode 100644
index 0000000..5b60165
--- /dev/null
+++ b/doxygen/img/Dtypes_fig20c.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig20d.gif b/doxygen/img/Dtypes_fig20d.gif
new file mode 100644
index 0000000..fdcb59a
--- /dev/null
+++ b/doxygen/img/Dtypes_fig20d.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig21.gif b/doxygen/img/Dtypes_fig21.gif
new file mode 100644
index 0000000..6d30528
--- /dev/null
+++ b/doxygen/img/Dtypes_fig21.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig22.gif b/doxygen/img/Dtypes_fig22.gif
new file mode 100644
index 0000000..5e2ca99
--- /dev/null
+++ b/doxygen/img/Dtypes_fig22.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig23.gif b/doxygen/img/Dtypes_fig23.gif
new file mode 100644
index 0000000..f0c9882
--- /dev/null
+++ b/doxygen/img/Dtypes_fig23.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig24.gif b/doxygen/img/Dtypes_fig24.gif
new file mode 100644
index 0000000..a1c28f4
--- /dev/null
+++ b/doxygen/img/Dtypes_fig24.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig25a.gif b/doxygen/img/Dtypes_fig25a.gif
new file mode 100644
index 0000000..16d3bcc
--- /dev/null
+++ b/doxygen/img/Dtypes_fig25a.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig25c.gif b/doxygen/img/Dtypes_fig25c.gif
new file mode 100644
index 0000000..a625b74
--- /dev/null
+++ b/doxygen/img/Dtypes_fig25c.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig26.gif b/doxygen/img/Dtypes_fig26.gif
new file mode 100644
index 0000000..24b34fb
--- /dev/null
+++ b/doxygen/img/Dtypes_fig26.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig27.gif b/doxygen/img/Dtypes_fig27.gif
new file mode 100644
index 0000000..71f182a
--- /dev/null
+++ b/doxygen/img/Dtypes_fig27.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig28.gif b/doxygen/img/Dtypes_fig28.gif
new file mode 100644
index 0000000..56d8d1b
--- /dev/null
+++ b/doxygen/img/Dtypes_fig28.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig3.gif b/doxygen/img/Dtypes_fig3.gif
new file mode 100644
index 0000000..993d12e
--- /dev/null
+++ b/doxygen/img/Dtypes_fig3.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig4.gif b/doxygen/img/Dtypes_fig4.gif
new file mode 100644
index 0000000..67aedef
--- /dev/null
+++ b/doxygen/img/Dtypes_fig4.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig5.gif b/doxygen/img/Dtypes_fig5.gif
new file mode 100644
index 0000000..075417d
--- /dev/null
+++ b/doxygen/img/Dtypes_fig5.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig6.gif b/doxygen/img/Dtypes_fig6.gif
new file mode 100644
index 0000000..516ab95
--- /dev/null
+++ b/doxygen/img/Dtypes_fig6.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig7.gif b/doxygen/img/Dtypes_fig7.gif
new file mode 100644
index 0000000..c18e9dc
--- /dev/null
+++ b/doxygen/img/Dtypes_fig7.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig8.gif b/doxygen/img/Dtypes_fig8.gif
new file mode 100644
index 0000000..d75d998
--- /dev/null
+++ b/doxygen/img/Dtypes_fig8.gif
Binary files differ
diff --git a/doxygen/img/Dtypes_fig9.gif b/doxygen/img/Dtypes_fig9.gif
new file mode 100644
index 0000000..873f0ab
--- /dev/null
+++ b/doxygen/img/Dtypes_fig9.gif
Binary files differ
diff --git a/doxygen/img/Files_fig3.gif b/doxygen/img/Files_fig3.gif
new file mode 100644
index 0000000..6912f5c
--- /dev/null
+++ b/doxygen/img/Files_fig3.gif
Binary files differ
diff --git a/doxygen/img/Files_fig4.gif b/doxygen/img/Files_fig4.gif
new file mode 100644
index 0000000..b4ff107
--- /dev/null
+++ b/doxygen/img/Files_fig4.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig1.gif b/doxygen/img/Groups_fig1.gif
new file mode 100644
index 0000000..193fff9
--- /dev/null
+++ b/doxygen/img/Groups_fig1.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig10_a.gif b/doxygen/img/Groups_fig10_a.gif
new file mode 100644
index 0000000..6595b34
--- /dev/null
+++ b/doxygen/img/Groups_fig10_a.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig10_b.gif b/doxygen/img/Groups_fig10_b.gif
new file mode 100644
index 0000000..9e7c234
--- /dev/null
+++ b/doxygen/img/Groups_fig10_b.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig10_c.gif b/doxygen/img/Groups_fig10_c.gif
new file mode 100644
index 0000000..20900ac
--- /dev/null
+++ b/doxygen/img/Groups_fig10_c.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig10_d.gif b/doxygen/img/Groups_fig10_d.gif
new file mode 100644
index 0000000..7251919
--- /dev/null
+++ b/doxygen/img/Groups_fig10_d.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig11_a.gif b/doxygen/img/Groups_fig11_a.gif
new file mode 100644
index 0000000..1d041d0
--- /dev/null
+++ b/doxygen/img/Groups_fig11_a.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig11_b.gif b/doxygen/img/Groups_fig11_b.gif
new file mode 100644
index 0000000..732109b
--- /dev/null
+++ b/doxygen/img/Groups_fig11_b.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig11_c.gif b/doxygen/img/Groups_fig11_c.gif
new file mode 100644
index 0000000..f1444eb
--- /dev/null
+++ b/doxygen/img/Groups_fig11_c.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig11_d.gif b/doxygen/img/Groups_fig11_d.gif
new file mode 100644
index 0000000..ee1b740
--- /dev/null
+++ b/doxygen/img/Groups_fig11_d.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig2.gif b/doxygen/img/Groups_fig2.gif
new file mode 100644
index 0000000..d14b0ff
--- /dev/null
+++ b/doxygen/img/Groups_fig2.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig3.gif b/doxygen/img/Groups_fig3.gif
new file mode 100644
index 0000000..aaa1fe7
--- /dev/null
+++ b/doxygen/img/Groups_fig3.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig4.gif b/doxygen/img/Groups_fig4.gif
new file mode 100644
index 0000000..a077bf3
--- /dev/null
+++ b/doxygen/img/Groups_fig4.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig5.gif b/doxygen/img/Groups_fig5.gif
new file mode 100644
index 0000000..55ddc3c
--- /dev/null
+++ b/doxygen/img/Groups_fig5.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig6.gif b/doxygen/img/Groups_fig6.gif
new file mode 100644
index 0000000..53a18d4
--- /dev/null
+++ b/doxygen/img/Groups_fig6.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig9_a.gif b/doxygen/img/Groups_fig9_a.gif
new file mode 100644
index 0000000..af0ab69
--- /dev/null
+++ b/doxygen/img/Groups_fig9_a.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig9_aa.gif b/doxygen/img/Groups_fig9_aa.gif
new file mode 100644
index 0000000..43ed356
--- /dev/null
+++ b/doxygen/img/Groups_fig9_aa.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig9_b.gif b/doxygen/img/Groups_fig9_b.gif
new file mode 100644
index 0000000..b07ec9c
--- /dev/null
+++ b/doxygen/img/Groups_fig9_b.gif
Binary files differ
diff --git a/doxygen/img/Groups_fig9_bb.gif b/doxygen/img/Groups_fig9_bb.gif
new file mode 100644
index 0000000..e13f534
--- /dev/null
+++ b/doxygen/img/Groups_fig9_bb.gif
Binary files differ
diff --git a/doxygen/img/LBDsetSubRWProg.png b/doxygen/img/LBDsetSubRWProg.png
new file mode 100644
index 0000000..4627740
--- /dev/null
+++ b/doxygen/img/LBDsetSubRWProg.png
Binary files differ
diff --git a/doxygen/img/Pmodel_fig2.gif b/doxygen/img/Pmodel_fig2.gif
new file mode 100644
index 0000000..8be15fb
--- /dev/null
+++ b/doxygen/img/Pmodel_fig2.gif
Binary files differ
diff --git a/doxygen/img/Pmodel_fig3.gif b/doxygen/img/Pmodel_fig3.gif
new file mode 100644
index 0000000..211f2ab
--- /dev/null
+++ b/doxygen/img/Pmodel_fig3.gif
Binary files differ
diff --git a/doxygen/img/Pmodel_fig5_a.gif b/doxygen/img/Pmodel_fig5_a.gif
new file mode 100644
index 0000000..6607b1c
--- /dev/null
+++ b/doxygen/img/Pmodel_fig5_a.gif
Binary files differ
diff --git a/doxygen/img/Pmodel_fig5_b.gif b/doxygen/img/Pmodel_fig5_b.gif
new file mode 100644
index 0000000..548df28
--- /dev/null
+++ b/doxygen/img/Pmodel_fig5_b.gif
Binary files differ
diff --git a/doxygen/img/Pmodel_fig5_c.gif b/doxygen/img/Pmodel_fig5_c.gif
new file mode 100644
index 0000000..459bc66
--- /dev/null
+++ b/doxygen/img/Pmodel_fig5_c.gif
Binary files differ
diff --git a/doxygen/img/Pmodel_fig5_d.gif b/doxygen/img/Pmodel_fig5_d.gif
new file mode 100644
index 0000000..207350d
--- /dev/null
+++ b/doxygen/img/Pmodel_fig5_d.gif
Binary files differ
diff --git a/doxygen/img/Pmodel_fig5_e.gif b/doxygen/img/Pmodel_fig5_e.gif
new file mode 100644
index 0000000..ee4f656
--- /dev/null
+++ b/doxygen/img/Pmodel_fig5_e.gif
Binary files differ
diff --git a/doxygen/img/Pmodel_fig6.gif b/doxygen/img/Pmodel_fig6.gif
new file mode 100644
index 0000000..2dac825
--- /dev/null
+++ b/doxygen/img/Pmodel_fig6.gif
Binary files differ
diff --git a/doxygen/img/PropListClassInheritance.gif b/doxygen/img/PropListClassInheritance.gif
new file mode 100644
index 0000000..c6f0309
--- /dev/null
+++ b/doxygen/img/PropListClassInheritance.gif
Binary files differ
diff --git a/doxygen/img/PropListEcosystem.gif b/doxygen/img/PropListEcosystem.gif
new file mode 100644
index 0000000..cf77ba4
--- /dev/null
+++ b/doxygen/img/PropListEcosystem.gif
Binary files differ
diff --git a/doxygen/img/Shared_Attribute.jpg b/doxygen/img/Shared_Attribute.jpg
new file mode 100644
index 0000000..058eeec
--- /dev/null
+++ b/doxygen/img/Shared_Attribute.jpg
Binary files differ
diff --git a/doxygen/img/StormDataset.png b/doxygen/img/StormDataset.png
new file mode 100644
index 0000000..da44335
--- /dev/null
+++ b/doxygen/img/StormDataset.png
Binary files differ
diff --git a/doxygen/img/UML_Attribute.jpg b/doxygen/img/UML_Attribute.jpg
new file mode 100644
index 0000000..5b3db7d
--- /dev/null
+++ b/doxygen/img/UML_Attribute.jpg
Binary files differ
diff --git a/doxygen/img/UML_FileAndProps.gif b/doxygen/img/UML_FileAndProps.gif
new file mode 100644
index 0000000..1de96c6
--- /dev/null
+++ b/doxygen/img/UML_FileAndProps.gif
Binary files differ
diff --git a/doxygen/img/VFL_Drivers.gif b/doxygen/img/VFL_Drivers.gif
new file mode 100644
index 0000000..4b626c6
--- /dev/null
+++ b/doxygen/img/VFL_Drivers.gif
Binary files differ
diff --git a/doxygen/img/cmpnddtype.png b/doxygen/img/cmpnddtype.png
new file mode 100644
index 0000000..53b4afd
--- /dev/null
+++ b/doxygen/img/cmpnddtype.png
Binary files differ
diff --git a/doxygen/img/crtatt.png b/doxygen/img/crtatt.png
new file mode 100644
index 0000000..93ac36c
--- /dev/null
+++ b/doxygen/img/crtatt.png
Binary files differ
diff --git a/doxygen/img/crtdset.png b/doxygen/img/crtdset.png
new file mode 100644
index 0000000..9cc3085
--- /dev/null
+++ b/doxygen/img/crtdset.png
Binary files differ
diff --git a/doxygen/img/crtf-pic.png b/doxygen/img/crtf-pic.png
new file mode 100644
index 0000000..f7c49b8
--- /dev/null
+++ b/doxygen/img/crtf-pic.png
Binary files differ
diff --git a/doxygen/img/crtgrp.png b/doxygen/img/crtgrp.png
new file mode 100644
index 0000000..506bc68
--- /dev/null
+++ b/doxygen/img/crtgrp.png
Binary files differ
diff --git a/doxygen/img/dataset.png b/doxygen/img/dataset.png
new file mode 100644
index 0000000..1524417
--- /dev/null
+++ b/doxygen/img/dataset.png
Binary files differ
diff --git a/doxygen/img/datasetwdata.png b/doxygen/img/datasetwdata.png
new file mode 100644
index 0000000..5f03827
--- /dev/null
+++ b/doxygen/img/datasetwdata.png
Binary files differ
diff --git a/doxygen/img/dataspace.png b/doxygen/img/dataspace.png
new file mode 100644
index 0000000..95e0b7d
--- /dev/null
+++ b/doxygen/img/dataspace.png
Binary files differ
diff --git a/doxygen/img/dataspace1.png b/doxygen/img/dataspace1.png
new file mode 100644
index 0000000..f21a5f5
--- /dev/null
+++ b/doxygen/img/dataspace1.png
Binary files differ
diff --git a/doxygen/img/datatype.png b/doxygen/img/datatype.png
new file mode 100644
index 0000000..6ea5732
--- /dev/null
+++ b/doxygen/img/datatype.png
Binary files differ
diff --git a/doxygen/img/dtypes_fig25b.gif b/doxygen/img/dtypes_fig25b.gif
new file mode 100644
index 0000000..9dbc225
--- /dev/null
+++ b/doxygen/img/dtypes_fig25b.gif
Binary files differ
diff --git a/doxygen/img/fileobj.png b/doxygen/img/fileobj.png
new file mode 100644
index 0000000..ae5212d
--- /dev/null
+++ b/doxygen/img/fileobj.png
Binary files differ
diff --git a/doxygen/img/group.png b/doxygen/img/group.png
new file mode 100644
index 0000000..7fec7fc
--- /dev/null
+++ b/doxygen/img/group.png
Binary files differ
diff --git a/doxygen/img/hdfview-anthrstrm-img.png b/doxygen/img/hdfview-anthrstrm-img.png
new file mode 100644
index 0000000..add4e48
--- /dev/null
+++ b/doxygen/img/hdfview-anthrstrm-img.png
Binary files differ
diff --git a/doxygen/img/hdfview-anthrstrm-sprdsht.png b/doxygen/img/hdfview-anthrstrm-sprdsht.png
new file mode 100644
index 0000000..4584fd5
--- /dev/null
+++ b/doxygen/img/hdfview-anthrstrm-sprdsht.png
Binary files differ
diff --git a/doxygen/img/hdfview-anthrstrm.png b/doxygen/img/hdfview-anthrstrm.png
new file mode 100644
index 0000000..afc2de3
--- /dev/null
+++ b/doxygen/img/hdfview-anthrstrm.png
Binary files differ
diff --git a/doxygen/img/hdfview-imgicon.png b/doxygen/img/hdfview-imgicon.png
new file mode 100644
index 0000000..f189080
--- /dev/null
+++ b/doxygen/img/hdfview-imgicon.png
Binary files differ
diff --git a/doxygen/img/hdfview-imgprop.png b/doxygen/img/hdfview-imgprop.png
new file mode 100644
index 0000000..717727b
--- /dev/null
+++ b/doxygen/img/hdfview-imgprop.png
Binary files differ
diff --git a/doxygen/img/hdfview-imgsubset.png b/doxygen/img/hdfview-imgsubset.png
new file mode 100644
index 0000000..19cec57
--- /dev/null
+++ b/doxygen/img/hdfview-imgsubset.png
Binary files differ
diff --git a/doxygen/img/hdfview-newcmpd.png b/doxygen/img/hdfview-newcmpd.png
new file mode 100644
index 0000000..b07b5f8
--- /dev/null
+++ b/doxygen/img/hdfview-newcmpd.png
Binary files differ
diff --git a/doxygen/img/hdfview-newimgsubset.png b/doxygen/img/hdfview-newimgsubset.png
new file mode 100644
index 0000000..fd16b23
--- /dev/null
+++ b/doxygen/img/hdfview-newimgsubset.png
Binary files differ
diff --git a/doxygen/img/hdfview-prop.png b/doxygen/img/hdfview-prop.png
new file mode 100644
index 0000000..16c0904
--- /dev/null
+++ b/doxygen/img/hdfview-prop.png
Binary files differ
diff --git a/doxygen/img/hdfview-qf.png b/doxygen/img/hdfview-qf.png
new file mode 100644
index 0000000..edc371f
--- /dev/null
+++ b/doxygen/img/hdfview-qf.png
Binary files differ
diff --git a/doxygen/img/hdfview-regref.png b/doxygen/img/hdfview-regref.png
new file mode 100644
index 0000000..7f2b02a
--- /dev/null
+++ b/doxygen/img/hdfview-regref.png
Binary files differ
diff --git a/doxygen/img/hdfview-regref1.png b/doxygen/img/hdfview-regref1.png
new file mode 100644
index 0000000..f754931
--- /dev/null
+++ b/doxygen/img/hdfview-regref1.png
Binary files differ
diff --git a/doxygen/img/hdfview-regref2.png b/doxygen/img/hdfview-regref2.png
new file mode 100644
index 0000000..5a73c01
--- /dev/null
+++ b/doxygen/img/hdfview-regref2.png
Binary files differ
diff --git a/doxygen/img/hdfview-regrefval.png b/doxygen/img/hdfview-regrefval.png
new file mode 100644
index 0000000..e0a666b
--- /dev/null
+++ b/doxygen/img/hdfview-regrefval.png
Binary files differ
diff --git a/doxygen/img/hdfview-table.png b/doxygen/img/hdfview-table.png
new file mode 100644
index 0000000..69301bc
--- /dev/null
+++ b/doxygen/img/hdfview-table.png
Binary files differ
diff --git a/doxygen/img/hdfview-tree.png b/doxygen/img/hdfview-tree.png
new file mode 100644
index 0000000..8ba2621
--- /dev/null
+++ b/doxygen/img/hdfview-tree.png
Binary files differ
diff --git a/doxygen/img/imgLBDsetCreate.gif b/doxygen/img/imgLBDsetCreate.gif
new file mode 100644
index 0000000..67585ef
--- /dev/null
+++ b/doxygen/img/imgLBDsetCreate.gif
Binary files differ
diff --git a/doxygen/img/imgLBDsetSubRW11.png b/doxygen/img/imgLBDsetSubRW11.png
new file mode 100644
index 0000000..8b1df86
--- /dev/null
+++ b/doxygen/img/imgLBDsetSubRW11.png
Binary files differ
diff --git a/doxygen/img/imgLBDsetSubRW12.png b/doxygen/img/imgLBDsetSubRW12.png
new file mode 100644
index 0000000..976966a
--- /dev/null
+++ b/doxygen/img/imgLBDsetSubRW12.png
Binary files differ
diff --git a/doxygen/img/imgLBDsetSubRW31.png b/doxygen/img/imgLBDsetSubRW31.png
new file mode 100644
index 0000000..31d5098
--- /dev/null
+++ b/doxygen/img/imgLBDsetSubRW31.png
Binary files differ
diff --git a/doxygen/img/imgLBDsetSubRW32.png b/doxygen/img/imgLBDsetSubRW32.png
new file mode 100644
index 0000000..f7d82fd
--- /dev/null
+++ b/doxygen/img/imgLBDsetSubRW32.png
Binary files differ
diff --git a/doxygen/img/imgLBDsetSubRW33.png b/doxygen/img/imgLBDsetSubRW33.png
new file mode 100644
index 0000000..69a368b
--- /dev/null
+++ b/doxygen/img/imgLBDsetSubRW33.png
Binary files differ
diff --git a/doxygen/img/imgLBFile.gif b/doxygen/img/imgLBFile.gif
new file mode 100644
index 0000000..b79c6d6
--- /dev/null
+++ b/doxygen/img/imgLBFile.gif
Binary files differ
diff --git a/doxygen/img/imggrpcreate.gif b/doxygen/img/imggrpcreate.gif
new file mode 100644
index 0000000..ac1dcf9
--- /dev/null
+++ b/doxygen/img/imggrpcreate.gif
Binary files differ
diff --git a/doxygen/img/imggrpdsets.gif b/doxygen/img/imggrpdsets.gif
new file mode 100644
index 0000000..3383dc6
--- /dev/null
+++ b/doxygen/img/imggrpdsets.gif
Binary files differ
diff --git a/doxygen/img/imggrps.gif b/doxygen/img/imggrps.gif
new file mode 100644
index 0000000..d48dbab
--- /dev/null
+++ b/doxygen/img/imggrps.gif
Binary files differ
diff --git a/doxygen/img/newgroupimage.png b/doxygen/img/newgroupimage.png
new file mode 100644
index 0000000..7bc4c90
--- /dev/null
+++ b/doxygen/img/newgroupimage.png
Binary files differ
diff --git a/doxygen/img/noattrs.png b/doxygen/img/noattrs.png
new file mode 100644
index 0000000..13abcc5
--- /dev/null
+++ b/doxygen/img/noattrs.png
Binary files differ
diff --git a/doxygen/img/properties.png b/doxygen/img/properties.png
new file mode 100644
index 0000000..083dc14
--- /dev/null
+++ b/doxygen/img/properties.png
Binary files differ
diff --git a/doxygen/img/scarletletter.png b/doxygen/img/scarletletter.png
new file mode 100644
index 0000000..7c5d2e6
--- /dev/null
+++ b/doxygen/img/scarletletter.png
Binary files differ
diff --git a/doxygen/img/showasimage.png b/doxygen/img/showasimage.png
new file mode 100644
index 0000000..8377292
--- /dev/null
+++ b/doxygen/img/showasimage.png
Binary files differ
diff --git a/doxygen/img/storm.png b/doxygen/img/storm.png
new file mode 100644
index 0000000..769b037
--- /dev/null
+++ b/doxygen/img/storm.png
Binary files differ
diff --git a/doxygen/img/tutr-lochk.png b/doxygen/img/tutr-lochk.png
new file mode 100644
index 0000000..297cd6d
--- /dev/null
+++ b/doxygen/img/tutr-lochk.png
Binary files differ
diff --git a/doxygen/img/tutr-lochks.png b/doxygen/img/tutr-lochks.png
new file mode 100644
index 0000000..477fc1d
--- /dev/null
+++ b/doxygen/img/tutr-lochks.png
Binary files differ
diff --git a/doxygen/img/tutr-locons.png b/doxygen/img/tutr-locons.png
new file mode 100644
index 0000000..bea5be4
--- /dev/null
+++ b/doxygen/img/tutr-locons.png
Binary files differ
diff --git a/doxygen/img/vol_architecture.png b/doxygen/img/vol_architecture.png
new file mode 100755
index 0000000..10e5596
--- /dev/null
+++ b/doxygen/img/vol_architecture.png
Binary files differ
diff --git a/fortran/src/H5Aff.F90 b/fortran/src/H5Aff.F90
index 7612bbd..e167b7f 100644
--- a/fortran/src/H5Aff.F90
+++ b/fortran/src/H5Aff.F90
@@ -1313,7 +1313,7 @@ CONTAINS
!!
!! \param attr_id Identifier of an attribute to write.
!! \param memtype_id Identifier of the attribute datatype (in memory).
-!! \param buf Data buffer; may be a scalar or an array.
+!! \param buf Data buffer; may be a scalar or an array.
!! \param dims Array to hold corresponding dimension sizes of data buffer buf;
!! dim(k) has value of the k-th dimension of buffer buf; values are ignored if buf is a scalar.
!! \param hdferr \fortran_error
@@ -1353,8 +1353,8 @@ CONTAINS
!!
!! \param attr_id Identifier of an attribute to read.
!! \param memtype_id Identifier of the attribute datatype (in memory).
-!! \param buf Buffer for data to be read.
-!! \param dims Array to hold corresponding dimension sizes of data buffer buf;
+!! \param buf Buffer for data to be read.
+!! \param dims Array to hold corresponding dimension sizes of data buffer buf;
!! dim(k) has value of the k-th dimension of buffer buf; values are ignored if buf is a scalar.
!! \param hdferr \fortran_error
!!
diff --git a/fortran/src/H5Dff.F90 b/fortran/src/H5Dff.F90
index 7707083..35a959e 100644
--- a/fortran/src/H5Dff.F90
+++ b/fortran/src/H5Dff.F90
@@ -210,15 +210,15 @@ CONTAINS
!!
!! \brief Creates a dataset at the specified location.
!!
-!! \param loc_id File or group identifier.
-!! \param name Dataset name.
-!! \param type_id Dataset datatype identifier.
-!! \param space_id Dataset dataspace identifier.
-!! \param dset_id Dataset identifier.
+!! \param loc_id File or group identifier
+!! \param name Dataset name
+!! \param type_id Dataset datatype identifier
+!! \param space_id Dataset dataspace identifier
+!! \param dset_id Dataset identifier
!! \param hdferr \fortran_error
-!! \param dcpl_id Dataset creation property list.
-!! \param lcpl_id Link creation property list.
-!! \param dapl_id Dataset access property list.
+!! \param dcpl_id Dataset creation property list
+!! \param lcpl_id Link creation property list
+!! \param dapl_id Dataset access property list
!!
SUBROUTINE h5dcreate_f(loc_id, name, type_id, space_id, dset_id, &
hdferr, dcpl_id, lcpl_id, dapl_id)
@@ -279,11 +279,11 @@ CONTAINS
!!
!! \brief Opens an existing dataset.
!!
-!! \param loc_id File or group identifier.
-!! \param name Dataset name.
-!! \param dset_id Dataset identifier.
+!! \param loc_id File or group identifier
+!! \param name Dataset name
+!! \param dset_id Dataset identifier
!! \param hdferr \fortran_error
-!! \param dapl_id Dataset access property list.
+!! \param dapl_id Dataset access property list
!!
SUBROUTINE h5dopen_f(loc_id, name, dset_id, hdferr, dapl_id)
IMPLICIT NONE
@@ -323,7 +323,7 @@ CONTAINS
!!
!! \brief Closes a dataset.
!!
-!! \param dset_id Dataset identifier.
+!! \param dset_id Dataset identifier
!! \param hdferr \fortran_error
!!
SUBROUTINE h5dclose_f(dset_id, hdferr)
@@ -349,8 +349,8 @@ CONTAINS
!! \brief Returns an identifier for a copy of the datatype for a
!! dataset.
!!
-!! \param dataset_id Dataset identifier.
-!! \param datatype_id Dataspace identifier.
+!! \param dataset_id Dataset identifier
+!! \param datatype_id Dataspace identifier
!! \param hdferr \fortran_error
!!
SUBROUTINE h5dget_type_f(dataset_id, datatype_id, hdferr)
@@ -376,8 +376,8 @@ CONTAINS
!!
!! \brief Extends a dataset with unlimited dimension.
!!
-!! \param dataset_id Dataset identifier.
-!! \param size Array containing the new magnitude of each dimension.
+!! \param dataset_id Dataset identifier
+!! \param size Array containing the new magnitude of each dimension
!! \param hdferr \fortran_error
!!
SUBROUTINE h5dset_extent_f(dataset_id, size, hdferr)
@@ -403,8 +403,8 @@ CONTAINS
!!
!! \brief Returns an identifier for a copy of the dataset creation property list for a dataset.
!!
-!! \param dataset_id Dataset identifier.
-!! \param plist_id Creation property list identifier.
+!! \param dataset_id Dataset identifier
+!! \param plist_id Creation property list identifier
!! \param hdferr \fortran_error
!!
SUBROUTINE h5dget_create_plist_f(dataset_id, plist_id, hdferr)
@@ -429,8 +429,8 @@ CONTAINS
!!
!! \brief Returns the amount of storage requires by a dataset
!!
-!! \param dataset_id Dataset identifier.
-!! \param size Datastorage size.
+!! \param dataset_id Dataset identifier
+!! \param size Datastorage size
!! \param hdferr \fortran_error
!!
SUBROUTINE h5dget_storage_size_f(dataset_id, size, hdferr)
@@ -455,10 +455,10 @@ CONTAINS
!!
!! \brief Returns maximum length of the VL array elements
!!
-!! \param dataset_id Dataset identifier.
-!! \param type_id Datatype identifier.
-!! \param space_id Dataspace identifier.
-!! \param len Buffer size.
+!! \param dataset_id Dataset identifier
+!! \param type_id Datatype identifier
+!! \param space_id Dataspace identifier
+!! \param len Buffer size
!! \param hdferr \fortran_error
!!
SUBROUTINE h5dvlen_get_max_len_f(dataset_id, type_id, space_id, len, hdferr)
@@ -487,7 +487,7 @@ CONTAINS
!!
!! \brief Returns the status of data space allocation.
!!
-!! \param dset_id Dataset identifier.
+!! \param dset_id Dataset identifier
!! \param flag Status; may have one of the following values:
!! \li H5D_SPACE_STS_ERROR_F
!! \li H5D_SPACE_STS_NOT_ALLOCATED_F
diff --git a/fortran/src/H5Fff.F90 b/fortran/src/H5Fff.F90
index c58cb9e..817dab0 100644
--- a/fortran/src/H5Fff.F90
+++ b/fortran/src/H5Fff.F90
@@ -4,6 +4,10 @@
!!
!! @see @ref H5F_UG, User Guide
!!
+
+!> @ingroup FH5F
+!!
+!! @brief This module contains Fortran interfaces for H5F functions.
!
! COPYRIGHT
! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -628,7 +632,7 @@ CONTAINS
!! \param file_id Target file identifier.
!! \param buf_ptr Pointer to the buffer into which the image of the HDF5 file is to be copied.
!! \param buf_len Size of the supplied buffer.
-!! \param hdferr Error code: 0 on success and -1 on failure.
+!! \param hdferr \fortran_error
!! \param buf_size Returns the size in bytes of the buffer required to store the file image, no data will be copied.
!!
SUBROUTINE h5fget_file_image_f(file_id, buf_ptr, buf_len, hdferr, buf_size)
@@ -673,7 +677,7 @@ CONTAINS
!!
!! \param file_id Target file identifier.
!! \param minimize Value of the setting.
-!! \param hdferr Error code: 0 on success and -1 on failure.
+!! \param hdferr \fortran_error
!!
SUBROUTINE h5fget_dset_no_attrs_hint_f(file_id, minimize, hdferr)
IMPLICIT NONE
@@ -706,7 +710,7 @@ CONTAINS
!!
!! \param file_id Target file identifier.
!! \param minimize Value of the setting.
-!! \param hdferr Error code: 0 on success and -1 on failure.
+!! \param hdferr \fortran_error
!!
SUBROUTINE h5fset_dset_no_attrs_hint_f(file_id, minimize, hdferr)
IMPLICIT NONE
diff --git a/fortran/src/H5Lff.F90 b/fortran/src/H5Lff.F90
index 0b8af8b..2b4e569 100644
--- a/fortran/src/H5Lff.F90
+++ b/fortran/src/H5Lff.F90
@@ -925,10 +925,10 @@ CONTAINS
!! \li H5_ITER_INC_F - Increasing order
!! \li H5_ITER_DEC_F - Decreasing order
!! \li H5_ITER_NATIVE_F - Fastest available order
-!! \param idx Iteration position at which to start.
+!! \param idx Iteration position at which to start, or <br />
+!! Position at which an interrupted iteration may be restarted
!! \param op Callback function passing data regarding the link to the calling application.
!! \param op_data User-defined pointer to data required by the application for its processing of the link.
-!! \param idx Position at which an interrupted iteration may be restarted.
!! \param return_value Return context:
!! \li Success: The return value of the first operator that
!! returns non-zero, or zero if all members were processed with no operator returning non-zero.
@@ -983,10 +983,11 @@ CONTAINS
!! \li H5_INDEX_NAME_F - Alphanumeric index on name
!! \li H5_INDEX_CRT_ORDER_F - Index on creation order
!! \param order Order within index:
-!! \li H5_ITER_INC_F - Increasing order
-!! \li H5_ITER_DEC_F - Decreasing order
-!! \li H5_ITER_NATIVE_F - Fastest available order
-!! \param idx Position at which an interrupted iteration may be restarted.
+!! \li H5_ITER_INC_F - Increasing order
+!! \li H5_ITER_DEC_F - Decreasing order
+!! \li H5_ITER_NATIVE_F - Fastest available order
+!! \param idx Iteration position at which to start, or <br />
+!! Position at which an interrupted iteration may be restarted
!! \param op Callback function passing data regarding the link to the calling application.
!! \param op_data User-defined pointer to data required by the application for its processing of the link.
!! \param return_value Return context:
@@ -995,7 +996,7 @@ CONTAINS
!! \li Failure: Negative if something goes wrong within the
!! library, or the negative value returned by one of the operators.
!! \param hdferr \fortran_error
-!! \param lapl_id Link access property list.
+!! \param lapl_id Link access property list
!!
SUBROUTINE h5literate_by_name_f(loc_id, group_name, index_type, order, &
idx, op, op_data, return_value, hdferr, lapl_id)
diff --git a/fortran/src/H5Off.F90 b/fortran/src/H5Off.F90
index 2139271..388e30e 100644
--- a/fortran/src/H5Off.F90
+++ b/fortran/src/H5Off.F90
@@ -285,6 +285,7 @@ CONTAINS
hdferr = h5oopen_by_token_c(loc_id, token, obj_id)
END SUBROUTINE h5oopen_by_token_f
+
!>
!! \ingroup FH5O
!!
diff --git a/fortran/src/H5Pff.F90 b/fortran/src/H5Pff.F90
index dbae328..e55dc58 100644
--- a/fortran/src/H5Pff.F90
+++ b/fortran/src/H5Pff.F90
@@ -677,8 +677,8 @@ CONTAINS
!!
!! \brief Sets the size of the parameter used to control the B-trees for indexing chunked datasets
!!
-!! \param prp_id File creation property list identifier.
-!! \param ik 1/2 rank of chunked storage B-tree.
+!! \param prp_id File creation property list identifier
+!! \param ik 1/2 rank of chunked storage B-tree
!! \param hdferr \fortran_error
!!
SUBROUTINE h5pset_istore_k_f (prp_id, ik, hdferr)
@@ -934,7 +934,7 @@ CONTAINS
!!
!! \param prp_id File access property list identifier.
!! \param memb_size Size in bytes of each file member.
-!! \param memb_plist Identifier of the file access property list to be used for each family member.
+!! \param memb_plist Identifier of the file access property list to be used for each family member
!! \param hdferr \fortran_error
!!
SUBROUTINE h5pset_fapl_family_f(prp_id, memb_size, memb_plist , hdferr)
@@ -964,7 +964,7 @@ CONTAINS
!!
!! \param prp_id File access property list identifier.
!! \param memb_size Size in bytes of each file member.
-!! \param memb_plist Identifier of the file access property list to be used for each family member.
+!! \param memb_plist Identifier of the file access property list to be used for each family member
!! \param hdferr \fortran_error
!!
SUBROUTINE h5pget_fapl_family_f(prp_id, memb_size, memb_plist , hdferr)
@@ -1029,8 +1029,8 @@ CONTAINS
!! \brief Queries the meta data cache and raw data chunk cache parameters.
!!
!! \param prp_id File access property list identifier.
-!! \param mdc_nelmts Number of elements (objects) in the metadata cache.
-!! \param rdcc_nelmts Number of elements (objects) in the raw data chunk cache.
+!! \param mdc_nelmts Number of elements (objects) in the metadata cache
+!! \param rdcc_nelmts Number of elements (objects) in the raw data chunk cache
!! \param rdcc_nbytes Total size of the raw data chunk cache, in bytes.
!! \param rdcc_w0 Preemption policy (0 or 1).
!! \param hdferr \fortran_error
@@ -1285,8 +1285,8 @@ CONTAINS
!!
!! \brief Returns information about a filter in a pipeline
!!
-!! \param prp_id Data creation or transfer property list identifier.
-!! \param filter_number Sequence number within the filter pipeline of the filter for which information is sought.
+!! \param prp_id Data creation or transfer property list identifier
+!! \param filter_number Sequence number within the filter pipeline of the filter for which information is sought
!! \param filter_id Filter identification number.
!! \param flags Bitbit vector specifying certain general properties of the filter.
!! \param cd_nelmts Number of elements in cd_values.
@@ -2724,9 +2724,9 @@ CONTAINS
!!
!! \brief Returns information about a filter in a pipeline
!!
-!! \param prp_id Data creation or transfer property list identifier.
+!! \param prp_id Data creation or transfer property list identifier
!! \param filter_id Filter identifier.
-!! \param flags Bit vector specifying certain general properties of the filter.
+!! \param flags Bit vector specifying certain general properties of the filter
!! \param cd_nelmts Number of elements in cd_values.
!! \param cd_values Auxiliary data for the filter.
!! \param namelen Number of characters in the name buffer.
@@ -2769,9 +2769,9 @@ CONTAINS
!!
!! \brief Adds a filter to the filter pipeline.
!!
-!! \param prp_id Data creation or transfer property list identifier.
+!! \param prp_id Data creation or transfer property list identifier
!! \param filter Filter to be modified.
-!! \param flags Bit vector specifying certain general properties of the filter.
+!! \param flags Bit vector specifying certain general properties of the filter
!! \param cd_nelmts Number of elements in cd_values.
!! \param cd_values Auxiliary data for the filter.
!! \param hdferr \fortran_error
@@ -2805,7 +2805,7 @@ CONTAINS
!!
!! \brief Delete one or more filters from the filter pipeline.
!!
-!! \param prp_id Data creation or transfer property list identifier.
+!! \param prp_id Data creation or transfer property list identifier
!! \param filter Filter to be removed.
!! \param hdferr \fortran_error
!!
@@ -3379,7 +3379,7 @@ CONTAINS
!! Success: Actual length of the expression. If provided buffer "expression" is
!! smaller, than expression will be truncated to fit into provided user buffer.
!! Failure: -1
-!! \param size Registered size of the transform expression.
+!! \param size Registered size of the transform expression
!!
SUBROUTINE h5pget_data_transform_f(plist_id, expression, hdferr, size)
IMPLICIT NONE
diff --git a/fortran/src/H5Rff.F90 b/fortran/src/H5Rff.F90
index d373158..f5dfb5c 100644
--- a/fortran/src/H5Rff.F90
+++ b/fortran/src/H5Rff.F90
@@ -222,8 +222,7 @@ CONTAINS
!! \param space_id Dataspace identifier.
!! \param hdferr \fortran_error
!!
-SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
-
+ SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
IMPLICIT NONE
INTEGER(HID_T), INTENT(IN) :: dset_id
TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref
@@ -246,6 +245,7 @@ SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
hdferr = h5rget_region_region_c(dset_id, ref_f, space_id )
END SUBROUTINE h5rget_region_region_f
+
!>
!! \ingroup FH5R
!!
@@ -307,6 +307,7 @@ SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
hdferr = h5rcreate_ptr_c(f_ptr, loc_id, name, namelen, INT(0), INT(-1,HID_T))
END SUBROUTINE h5rcreate_object_f
+
!>
!! \ingroup FH5R
!!
@@ -396,7 +397,7 @@ SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
!>
!! \ingroup FH5R
!!
-!! \brief Opens the HDF5 object referenced.
+!! \brief Opens the HDF5 object referenced
!!
!! \note \fortran_obsolete
!!
@@ -422,7 +423,7 @@ SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
!>
!! \ingroup FH5R
!!
-!! \brief Opens the dataset region.
+!! \brief Opens the dataset region
!!
!! \note \fortran_obsolete
!!
diff --git a/fortran/src/H5Sff.F90 b/fortran/src/H5Sff.F90
index 19a5b1f..6599863 100644
--- a/fortran/src/H5Sff.F90
+++ b/fortran/src/H5Sff.F90
@@ -270,7 +270,7 @@ CONTAINS
!! \brief Gets the number of element points in the current selection
!!
!! \param space_id Dataspace identifier.
-!! \param num_points Number of element points in the current dataspace selection.
+!! \param num_points Number of element points in the current dataspace selection
!! \param hdferr \fortran_error
!!
SUBROUTINE h5sget_select_elem_npoints_f(space_id, num_points, hdferr)
@@ -443,7 +443,7 @@ CONTAINS
!!
!! \brief Verifies that the selection is within the extent of the dataspace.
!!
-!! \param space_id Identifier for the dataspace for whichselection is verified.
+!! \param space_id Identifier for the dataspace for which selection is verified
!! \param status TRUE if the selection is contained within the extent, FALSE otherwise.
!! \param hdferr \fortran_error
!!
diff --git a/fortran/src/H5Tff.F90 b/fortran/src/H5Tff.F90
index d32b160..ceb5447 100644
--- a/fortran/src/H5Tff.F90
+++ b/fortran/src/H5Tff.F90
@@ -109,7 +109,7 @@ CONTAINS
!! \brief Commits a transient datatype to a file, creating a new named datatype.
!!
!! \param loc_id Location identifier.
-!! \param name Name of the datatype to be stored at the specified location.
+!! \param name Name of the datatype to be stored at the specified location
!! \param type_id Identifier of a datatype to be stored.
!! \param hdferr \fortran_error
!! \param lcpl_id Link creation property list.
@@ -1391,7 +1391,7 @@ CONTAINS
!!
!! \brief Creates an array datatype object.
!!
-!! \param base_id Datatype identifier for the array base datatype.
+!! \param base_id Datatype identifier for the array base datatype
!! \param rank Rank of the array.
!! \param dims Array dimension sizes.
!! \param type_id Array datatype identifier.
diff --git a/fortran/src/H5VLff.F90 b/fortran/src/H5VLff.F90
index 3ebd2f1..1d60848 100644
--- a/fortran/src/H5VLff.F90
+++ b/fortran/src/H5VLff.F90
@@ -1,4 +1,4 @@
-!> @defgroup FH5VL Fortran Datatype (H5VL) Interface
+!> @defgroup FH5VL Fortran VOL (H5VL) Interface
!!
!! @see H5VL, C-API
!!
diff --git a/fortran/src/H5Zff.F90 b/fortran/src/H5Zff.F90
index 4fa81e9..711e26b 100644
--- a/fortran/src/H5Zff.F90
+++ b/fortran/src/H5Zff.F90
@@ -1,3 +1,10 @@
+!> @defgroup FH5Z Fortran Filter (H5Z) Interface
+!!
+!! @see H5Z, C-API
+!!
+!! @see @ref H5Z_UG, User Guide
+!!
+
!> @ingroup FH5Z
!!
!! @brief This module contains Fortran interfaces for H5Z functions.
diff --git a/fortran/src/H5_buildiface.F90 b/fortran/src/H5_buildiface.F90
index 090b6db..30d29ba 100644
--- a/fortran/src/H5_buildiface.F90
+++ b/fortran/src/H5_buildiface.F90
@@ -423,7 +423,7 @@ PROGRAM H5_buildiface
! buf - Data buffer; may be a scalar or an array
!
! Outputs:
-! hdferr - Returns 0 if successful and -1 if fails
+! hdferr - \fortran_error
!
! AUTHOR
! Elena Pourmal
@@ -550,7 +550,7 @@ PROGRAM H5_buildiface
!
! Outputs:
! buf - Data buffer; may be a scalar or an array
-! hdferr - Returns 0 if successful and -1 if fails
+! hdferr - \fortran_error
!
! AUTHOR
! Elena Pourmal
diff --git a/fortran/src/H5_ff.F90 b/fortran/src/H5_ff.F90
index 5968e73..07705cf 100644
--- a/fortran/src/H5_ff.F90
+++ b/fortran/src/H5_ff.F90
@@ -762,7 +762,7 @@ CONTAINS
!!
!! \brief Converts the KIND to the correct HDF type
!!
-!! \param ikind Fortran KIND parameter.
+!! \param ikind Fortran KIND parameter
!! \param flag Whether KIND is of type INTEGER or REAL:
!! \li H5_INTEGER_KIND - integer
!! \li H5_REAL_KIND - real
@@ -814,8 +814,8 @@ CONTAINS
!!
!! \brief Computes the offset in memory
!!
-!! \param start Starting pointer address.
-!! \param end Ending pointer address.
+!! \param start Starting pointer address
+!! \param end Ending pointer address
!!
!! \result offset Offset of a member within the derived type.
!!
@@ -836,7 +836,7 @@ CONTAINS
!!
!! \brief Convert time_t structure (C) to Fortran DATE AND TIME storage format.
!!
-!! \param stdtime_t Object of type time_t that contains a time value.
+!! \param stdtime_t Object of type time_t that contains a time value
!! \result datetime A date/time array using Fortran conventions:
!! \li datetime(1) = year
!! \li datetime(2) = month
diff --git a/hl/fortran/src/H5DSff.F90 b/hl/fortran/src/H5DSff.F90
index bb80eb7..dcc6ed0 100644
--- a/hl/fortran/src/H5DSff.F90
+++ b/hl/fortran/src/H5DSff.F90
@@ -1,6 +1,6 @@
-!> @defgroup FH5DS Fortran High-level H5DS Interface
+!> @defgroup FH5DS Fortran High Level Dimension Scales (H5DS) Interface
!!
-!! @see H5DS, C-API
+!! @see H5DS, C-HL API
!!
!! @see @ref H5DS_UG, User Guide
!!
@@ -40,6 +40,7 @@ MODULE H5DS
USE hdf5
CONTAINS
+
!>
!! \ingroup FH5DS
!!
@@ -47,7 +48,7 @@ CONTAINS
!!
!! \param dsid The dataset to be made a Dimemsion Scale.
!! \param errcode \fortran_error
-!! \param dimname The dimension name.
+!! \param dimname The dimension name
!!
SUBROUTINE H5DSset_scale_f( dsid, errcode, dimname)
@@ -55,7 +56,7 @@ CONTAINS
INTEGER(hid_t), INTENT(in) :: dsid
CHARACTER(LEN=*), INTENT(in), OPTIONAL :: dimname
- INTEGER :: errcode
+ INTEGER :: errcode
INTEGER(SIZE_T) :: dimname_len ! length of dimname (if present)
@@ -88,7 +89,7 @@ CONTAINS
!! \param did The dataset.
!! \param dsid The scale to be attached.
!! \param idx The dimension of \p did that \p dsid is associated with.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSattach_scale_f( did, dsid, idx, errcode)
@@ -125,7 +126,7 @@ CONTAINS
!! \param did The dataset.
!! \param dsid The scale to be detached.
!! \param idx The dimension of \p did to detach.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSdetach_scale_f( did, dsid, idx, errcode)
@@ -164,7 +165,7 @@ CONTAINS
!! \param dsid The scale to be attached.
!! \param idx The dimension of \p did that \p dsid is associated with.
!! \param is_attached If dimension scale \p dsid is currently attached to dimension \p idx of dataset \p did.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSis_attached_f( did, dsid, idx, is_attached, errcode)
@@ -213,7 +214,7 @@ CONTAINS
!!
!! \param did The data set to query.
!! \param is_scale If is a Dimension Scale.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSis_scale_f( did, is_scale, errcode)
@@ -253,7 +254,7 @@ CONTAINS
!! \param did The data set.
!! \param idx The dimension.
!! \param label The label.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSset_label_f( did, idx, label, errcode)
@@ -296,7 +297,7 @@ CONTAINS
!! \param idx The dimension.
!! \param label The label.
!! \param size The length of the \p label buffer.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSget_label_f( did, idx, label, size, errcode)
@@ -336,7 +337,7 @@ CONTAINS
!! \param did Dimension scale identifier.
!! \param name Buffer to contain the returned name.
!! \param size Size in bytes, of the name buffer.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSget_scale_name_f(did, name, size, errcode)
@@ -371,7 +372,7 @@ CONTAINS
!! \param did The dataset to query.
!! \param idx The dimension of \p did to query.
!! \param num_scales Number of Dimension Scales associated with \p did.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE H5DSget_num_scales_f( did, idx, num_scales, errcode)
diff --git a/hl/fortran/src/H5IMff.F90 b/hl/fortran/src/H5IMff.F90
index a2573d6..967c35d 100644
--- a/hl/fortran/src/H5IMff.F90
+++ b/hl/fortran/src/H5IMff.F90
@@ -1,6 +1,6 @@
-!> @defgroup FH5IM Fortran High-level H5IM Interface
+!> @defgroup FH5IM Fortran High Level Images (H5IM) Interface
!!
-!! @see H5IM, C-API
+!! @see H5IM, C-HL API
!!
!! @see @ref H5IM_UG, User Guide
!!
@@ -42,13 +42,13 @@ CONTAINS
!>
!! \ingroup FH5IM
!!
-!! \brief Creates and writes an image an 8 bit image.
+!! \brief Creates and writes an image an 8 bit image
!!
!! \param loc_id Location identifier. The identifier may be that of a file or group.
!! \param dset_name The name of the dataset to create.
!! \param width The width of the image.
-!! \param height The height of the image.
-!! \param buf Buffer with data to be written to the dataset.
+!! \param height The height of the image
+!! \param buf Buffer with data to be written to the dataset
!! \param errcode \fortran_error
!!
SUBROUTINE h5immake_image_8bit_f(loc_id,&
@@ -105,7 +105,7 @@ CONTAINS
IMPLICIT NONE
- INTEGER(hid_t), INTENT(in) :: loc_id
+ INTEGER(hid_t), INTENT(in) :: loc_id
CHARACTER(len=*), INTENT(in) :: dset_name
INTEGER, INTENT(inout), DIMENSION(*) :: buf
INTEGER :: errcode
@@ -133,7 +133,7 @@ CONTAINS
!! \ingroup FH5IM
!!
!! \brief Creates and writes an image a 24 bit image.
-!!
+!!
!! \param loc_id Location identifier. The identifier may be that of a file or group.
!! \param dset_name The name of the dataset to create.
!! \param width The width of the image.
@@ -307,7 +307,7 @@ CONTAINS
IMPORT :: C_CHAR
IMPORT :: HID_T, SIZE_T, HSIZE_T
IMPLICIT NONE
- INTEGER(hid_t), INTENT(in) :: loc_id
+ INTEGER(hid_t), INTENT(in) :: loc_id
INTEGER(size_t) :: namelen
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: pal_name
INTEGER(hsize_t), INTENT(in), DIMENSION(*) :: pal_dims
@@ -437,7 +437,7 @@ CONTAINS
IMPORT :: C_CHAR
IMPORT :: HID_T, SIZE_T, HSIZE_T
IMPLICIT NONE
- INTEGER(hid_t), INTENT(in) :: loc_id
+ INTEGER(hid_t), INTENT(in) :: loc_id
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: image_name
INTEGER(hsize_t), INTENT(inout) :: npals
INTEGER(size_t) :: namelen
@@ -471,7 +471,7 @@ CONTAINS
CHARACTER(len=*), INTENT(in) :: image_name
INTEGER, INTENT(in) :: pal_number
INTEGER(hsize_t), DIMENSION(*), INTENT(inout) :: pal_dims
- INTEGER :: errcode
+ INTEGER :: errcode
INTEGER(size_t) :: namelen ! name length
INTERFACE
@@ -512,7 +512,7 @@ CONTAINS
IMPLICIT NONE
- INTEGER(hid_t), INTENT(in) :: loc_id
+ INTEGER(hid_t), INTENT(in) :: loc_id
CHARACTER(len=*), INTENT(in) :: image_name
INTEGER, INTENT(in) :: pal_number
INTEGER, INTENT(inout), DIMENSION(*) :: pal_data
@@ -525,10 +525,10 @@ CONTAINS
IMPORT :: C_CHAR
IMPORT :: HID_T, SIZE_T
IMPLICIT NONE
- INTEGER(hid_t), INTENT(in) :: loc_id
+ INTEGER(hid_t), INTENT(in) :: loc_id
INTEGER(size_t) :: namelen
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: image_name
- INTEGER, INTENT(in) :: pal_number
+ INTEGER, INTENT(in) :: pal_number
INTEGER, INTENT(inout), DIMENSION(*) :: pal_data
END FUNCTION h5imget_palette_c
END INTERFACE
@@ -575,7 +575,3 @@ CONTAINS
END MODULE H5IM
-
-
-
-
diff --git a/hl/fortran/src/H5LTff.F90 b/hl/fortran/src/H5LTff.F90
index d2e9daf..3b50ad8 100644
--- a/hl/fortran/src/H5LTff.F90
+++ b/hl/fortran/src/H5LTff.F90
@@ -1,6 +1,6 @@
-!> @defgroup FH5LT Fortran High-level H5LT Interface
+!> @defgroup FH5LT Fortran High Level Lite (H5LT) Interface
!!
-!! @see H5LT, C-API
+!! @see H5LT, C-HL API
!!
!! @see @ref H5LT_UG, User Guide
!!
@@ -98,7 +98,7 @@ MODULE H5LT_CONST
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: attr_name ! name of the attribute
INTEGER(size_t), INTENT(in) :: size ! size of attribute array
TYPE(C_PTR), VALUE :: buf ! data buffer
- CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dtype ! flag indicating the datatype of the the buffer:
+ CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dtype ! flag indicating the datatype of the buffer:
! R=Real, D=DOUBLE, I=Integer, C=Character
INTEGER(size_t) :: SizeOf_buf ! Sizeof the buf datatype
END FUNCTION h5ltset_attribute_c
@@ -116,7 +116,7 @@ MODULE H5LT_CONST
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name ! name of the dataset
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: attr_name ! name of the attribute
TYPE(C_PTR), VALUE :: buf ! data buffer
- CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dtype ! flag indicating the datatype of the the buffer:
+ CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dtype ! flag indicating the datatype of the buffer:
! R=Real, D=DOUBLE, I=Integer
INTEGER(size_t), INTENT(in) :: SizeOf_buf ! Sizeof the buf data type
END FUNCTION h5ltget_attribute_c
@@ -291,7 +291,7 @@ CONTAINS
INTEGER, INTENT(in) :: rank
INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims
INTEGER(hid_t), INTENT(in) :: type_id
- INTEGER :: errcode
+ INTEGER :: errcode
INTEGER(size_t) :: namelen ! name length
INTEGER, INTENT(in), &
DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf ! data buffer
@@ -335,7 +335,7 @@ CONTAINS
INTEGER, INTENT(in) :: rank
INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims
INTEGER(hid_t), INTENT(in) :: type_id
- INTEGER :: errcode
+ INTEGER :: errcode
INTEGER(size_t) :: namelen ! name length
INTEGER, INTENT(in), &
DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf ! data buffer
@@ -377,7 +377,7 @@ CONTAINS
!!
!! \brief Reads a dataset of a type \p type_id.
!!
- !! \note \fortran_approved
+ !! \note \fortran_approved
!!
!! \param loc_id Location identifier. The identifier may be that of a file or group.
!! \param dset_name The name of the dataset to create.
@@ -881,7 +881,7 @@ CONTAINS
INTEGER(hid_t), INTENT(in) :: loc_id
CHARACTER(LEN=*), INTENT(in) :: dset_name
INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims
- INTEGER :: errcode
+ INTEGER :: errcode
INTEGER(size_t) :: namelen ! name length
INTEGER, INTENT(inout), &
DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf
@@ -1039,7 +1039,7 @@ CONTAINS
!>
!! \ingroup FH5LT
!!
- !! \brief Creates and writes an attribute and is a generic replacement for data type specific
+ !! \brief Creates and writes an attribute and is a generic replacement for data type specific
!! Fortran h5ltset_attribute_*_f APIs. There is no C equivalent API.
!!
!! \note \fortran_approved
@@ -1105,7 +1105,7 @@ CONTAINS
!! \param obj_name The name of the object to attach the attribute.
!! \param attr_name The attribute name.
!! \param buf Buffer with data to be written to the attribute.
- !! \param size The size of the 1D array (one in the case of a scalar attribute).
+ !! \param size The size of the 1D array (one in the case of a scalar attribute).
!! This value is used by H5Screate_simple() to create the dataspace.
!! \param errcode \fortran_error
!!
@@ -1154,7 +1154,7 @@ CONTAINS
!! \param obj_name The name of the object to attach the attribute.
!! \param attr_name The attribute name.
!! \param buf Buffer with data to be written to the attribute.
- !! \param size The size of the 1D array (one in the case of a scalar attribute).
+ !! \param size The size of the 1D array (one in the case of a scalar attribute).
!! This value is used by H5Screate_simple() to create the dataspace.
!! \param errcode \fortran_error
!!
@@ -1202,7 +1202,7 @@ CONTAINS
!! \param obj_name The name of the object to attach the attribute.
!! \param attr_name The attribute name.
!! \param buf Buffer with data to be written to the attribute.
- !! \param size The size of the 1D array (one in the case of a scalar attribute).
+ !! \param size The size of the 1D array (one in the case of a scalar attribute).
!! This value is used by H5Screate_simple() to create the dataspace.
!! \param errcode \fortran_error
!!
@@ -1601,7 +1601,7 @@ CONTAINS
!>
!! \ingroup FH5LT
!!
- !! \brief Retrieves information about a dataset.
+ !! \brief Retrieves information about a dataset.
!!
!! \param loc_id Identifier of the object to locate the dataset within.
!! \param dset_name The dataset name.
@@ -1633,7 +1633,7 @@ CONTAINS
IMPORT :: HID_T, SIZE_T, HSIZE_T
IMPLICIT NONE
INTEGER(hid_t), INTENT(in) :: loc_id
- INTEGER(size_t) :: namelen
+ INTEGER(size_t) :: namelen
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name
INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims
INTEGER, INTENT(inout) :: type_class
@@ -1759,7 +1759,7 @@ CONTAINS
!! \brief Determines whether an HDF5 path is valid and, optionally, whether the path resolves to an HDF5 object.
!!
!! \param loc_id Identifier of an object in the file.
- !! \param path The path to the object to check; links in path may be of any type.
+ !! \param path The path to the object to check; links in path may be of any type.
!! \param check_object_valid Indicates whether to check if the final component of the path resolves to a valid object.
!! \param path_valid Object status.
!! \param errcode \fortran_error
diff --git a/hl/fortran/src/H5TBff.F90 b/hl/fortran/src/H5TBff.F90
index 611d5ec..52af33f 100644
--- a/hl/fortran/src/H5TBff.F90
+++ b/hl/fortran/src/H5TBff.F90
@@ -1,6 +1,6 @@
-!> @defgroup FH5TB Fortran High-level H5TB Interface
+!> @defgroup FH5TB Fortran High Level Table (H5TB) Interface
!!
-!! @see H5TB, C-API
+!! @see H5TB, C-HL API
!!
!! @see @ref H5TB_UG, User Guide
!!
@@ -45,7 +45,7 @@
INTERFACE h5tbwrite_field_name_f
#ifdef H5_DOXYGEN_FORTRAN
- MODULE PROCEDURE h5tbwrite_field_name_f
+ MODULE PROCEDURE h5tbwrite_field_name_f
#else
MODULE PROCEDURE h5tbwrite_field_name_f_int
MODULE PROCEDURE h5tbwrite_field_name_f_string
@@ -214,12 +214,12 @@ CONTAINS
!! \param field_types An array containing the type of the fields.
!! \param chunk_size The chunk size.
!! \param compress Flag that turns compression on or off.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
#ifdef H5_DOXYGEN_FORTRAN
SUBROUTINE h5tbmake_table_f(&
#else
- SUBROUTINE h5tbmake_table_f90(&
+ SUBROUTINE h5tbmake_table_f90(&
#endif
table_title,&
loc_id,&
@@ -308,7 +308,7 @@ CONTAINS
#ifdef H5_DOXYGEN_FORTRAN
END SUBROUTINE h5tbmake_table_f
#else
- END SUBROUTINE h5tbmake_table_f90
+ END SUBROUTINE h5tbmake_table_f90
#endif
!>
@@ -331,7 +331,7 @@ CONTAINS
!! \param fill_data Fill values data
!! \param compress Flag that turns compression on or off
!! \param data Buffer with data to be written to the table
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
#ifdef H5_DOXYGEN_FORTRAN
SUBROUTINE h5tbmake_table_f(&
@@ -446,9 +446,9 @@ CONTAINS
!! \param nfields Number of fields, i.e., size of dst_offset and dst_sizes arrays.
!! \param dst_size The size of the structure type, as calculated by sizeof or storage_size
!! \param dst_offset An array containing the offsets of the fields. These offsets can be calculated with H5OFFSETOF.
-!! \param dst_sizes An array containing the sizes of the fields. These sizes can be calculated with sizeof or storage_size.
+!! \param dst_sizes An array containing the sizes of the fields. These sizes can be calculated with sizeof or storage_size.
!! \param dst_buf Pointer to buffer with data.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE h5tbread_table_f(loc_id, dset_name, nfields, dst_size, dst_offset, &
dst_sizes, dst_buf, errcode)
@@ -509,7 +509,7 @@ CONTAINS
!! \ingroup FH5TB
!!
!! \brief Overwrites field.
-!!
+!!
!! \param loc_id Location identifier. The identifier may be that of a file or group.
!! \param dset_name The name of the dataset to overwrite
!! \param field_name The names of the fields to write
@@ -556,7 +556,7 @@ CONTAINS
errcode = h5tbwrite_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
start,nrecords,type_size,f_ptr)
#ifdef H5_DOXYGEN_FORTRAN
- END SUBROUTINE h5tbwrite_field_name_f
+ END SUBROUTINE h5tbwrite_field_name_f
#else
END SUBROUTINE h5tbwrite_field_name_f_int
@@ -607,7 +607,7 @@ CONTAINS
!! \param nrecords The number of records to read.
!! \param type_size The size in bytes of the structure associated with the table. Obtained with sizeof or storage_size.
!! \param buf Buffer with data
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE h5tbread_field_name_f(&
#else
@@ -700,7 +700,7 @@ CONTAINS
!! \param type_size The size of the structure type, as calculated by sizeof or storage_size.
!! \param buf Buffer with data.
!! \param errcode \fortran_error
-!!
+!!
SUBROUTINE h5tbwrite_field_index_f(&
#else
SUBROUTINE h5tbwrite_field_index_f_int(&
@@ -776,7 +776,7 @@ CONTAINS
!>
!! \ingroup FH5TB
!!
-!! \brief Reads field. The fields are identified by index.
+!! \brief Reads field. The fields are identified by index.
!!
!! \param loc_id Location identifier. The identifier may be that of a file or group.
!! \param dset_name The name of the dataset to read.
@@ -957,7 +957,7 @@ CONTAINS
field_name,&
errcode )
IMPLICIT NONE
- INTEGER(hid_t), INTENT(in) :: loc_id
+ INTEGER(hid_t), INTENT(in) :: loc_id
CHARACTER(LEN=*), INTENT(in) :: dset_name
CHARACTER(LEN=*), INTENT(in) :: field_name
INTEGER :: errcode
@@ -995,7 +995,7 @@ CONTAINS
!! \param dset_name The name of the dataset to read.
!! \param nfields The number of fields.
!! \param nrecords The number of records.
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!!
SUBROUTINE h5tbget_table_info_f(loc_id,&
dset_name,&
@@ -1017,7 +1017,7 @@ CONTAINS
IMPORT :: C_CHAR
IMPORT :: HID_T, SIZE_T, HSIZE_T
IMPLICIT NONE
- INTEGER(hid_t), INTENT(in) :: loc_id
+ INTEGER(hid_t), INTENT(in) :: loc_id
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name
INTEGER(hsize_t), INTENT(inout):: nfields
INTEGER(hsize_t), INTENT(inout):: nrecords
@@ -1043,7 +1043,7 @@ CONTAINS
!! \param field_offsets An array containing the offsets of the fields.
!! \param type_size The size of the HDF5 datatype associated with the table
!! (i.e., the size in bytes of the HDF5 compound datatype used to define a row, or record, in the table).
-!! \param errcode \fortran_error
+!! \param errcode \fortran_error
!! \param maxlen_out Maximum character length of the field names.
!!
SUBROUTINE h5tbget_field_info_f(loc_id,&
diff --git a/hl/src/H5DOpublic.h b/hl/src/H5DOpublic.h
index 13b2422..20f4c98 100644
--- a/hl/src/H5DOpublic.h
+++ b/hl/src/H5DOpublic.h
@@ -18,7 +18,11 @@
extern "C" {
#endif
-/**\defgroup H5DO Optimizations
+/** \page H5DO_UG The HDF5 High Level Optimizations
+ * @todo Under Construction
+ */
+
+/**\defgroup H5DO HDF5 Optimizations APIs (H5DO)
*
* <em>Bypassing default HDF5 behavior in order to optimize for specific
* use cases (H5DO)</em>
diff --git a/hl/src/H5DSpublic.h b/hl/src/H5DSpublic.h
index 77dd64b..4fcf681 100644
--- a/hl/src/H5DSpublic.h
+++ b/hl/src/H5DSpublic.h
@@ -31,7 +31,11 @@ typedef herr_t (*H5DS_iterate_t)(hid_t dset, unsigned dim, hid_t scale, void *vi
extern "C" {
#endif
-/**\defgroup H5DS Dimension Scales
+/** \page H5DS_UG The HDF5 High Level Dimension Scales
+ * @todo Under Construction
+ */
+
+/**\defgroup H5DS HDF5 Dimension Scales APIs (H5DS)
*
* <em>Creating and manipulating HDF5 datasets that are associated with
* the dimension of another HDF5 dataset (H5DS)</em>
@@ -77,21 +81,21 @@ extern "C" {
/* THIS IS A NEW ROUTINE NOT ON OLD PORTAL */
/**
- * --------------------------------------------------------------------------
- * \ingroup H5DS
+ * --------------------------------------------------------------------------
+ * \ingroup H5DS
*
- * \brief Determines if new references are used with dimension scales.
+ * \brief Determines if new references are used with dimension scales.
*
- * \param[in] obj_id Object identifier
- * \param[out] with_new_ref New references are used or not
+ * \param[in] obj_id Object identifier
+ * \param[out] with_new_ref New references are used or not
*
- * \return \herr_t
+ * \return \herr_t
*
- * \details H5DSwith_new_ref() takes any object identifier and checks
- * if new references are used for dimension scales. Currently,
- * new references are used when non-native VOL connector is
- * used or when H5_DIMENSION_SCALES_WITH_NEW_REF is set up
- * via configure option.
+ * \details H5DSwith_new_ref() takes any object identifier and checks
+ * if new references are used for dimension scales. Currently,
+ * new references are used when non-native VOL connector is
+ * used or when H5_DIMENSION_SCALES_WITH_NEW_REF is set up
+ * via configure option.
*
*/
H5_HLDLL herr_t H5DSwith_new_ref(hid_t obj_id, hbool_t *with_new_ref);
diff --git a/hl/src/H5IMpublic.h b/hl/src/H5IMpublic.h
index b5426d6..bccf3c4 100644
--- a/hl/src/H5IMpublic.h
+++ b/hl/src/H5IMpublic.h
@@ -18,7 +18,11 @@
extern "C" {
#endif
-/**\defgroup H5IM Images
+/** \page H5IM_UG The HDF5 High Level Images
+ * @todo Under Construction
+ */
+
+/**\defgroup H5IM HDF5 Images API (H5IM)
*
* <em>Creating and manipulating HDF5 datasets intended to be
* interpreted as images (H5IM)</em>
@@ -27,7 +31,7 @@ extern "C" {
* document: \ref IMG
* This version of the API is primarily concerned with two dimensional raster
* data similar to HDF4 Raster Images.
- * The HDF5 Images API uses the \ref H5LT HDF5 API.
+ * The HDF5 Images API uses the \ref H5LT.
*
* \note \Bold{Programming hints:}
* \note To use any of these functions or subroutines,
diff --git a/hl/src/H5LDpublic.h b/hl/src/H5LDpublic.h
index fed0c1c..363b59c 100644
--- a/hl/src/H5LDpublic.h
+++ b/hl/src/H5LDpublic.h
@@ -34,7 +34,7 @@ extern "C" {
* It will return failure if \p cur_dims is NULL.
*
* \note See Also:
- * \note Dataset Watch functions (used with \ref h5watch):
+ * \note Dataset Watch functions (used with h5watch):
* - H5LDget_dset_dims()
* - H5LDget_dset_elmts()
* - H5LDget_dset_type_size()
@@ -71,7 +71,7 @@ H5_HLDLL herr_t H5LDget_dset_dims(hid_t did, hsize_t *cur_dims);
* conflict with these two separators.
*
* \note See Also:
- * \note Dataset Watch functions (used with \ref h5watch):
+ * \note Dataset Watch functions (used with h5watch):
* - H5LDget_dset_dims()
* - H5LDget_dset_elmts()
* - H5LDget_dset_type_size()
@@ -123,7 +123,7 @@ H5_HLDLL size_t H5LDget_dset_type_size(hid_t did, const char *fields);
* two separators.
*
* \note See Also:
- * \note Dataset Watch functions (used with \ref h5watch):
+ * \note Dataset Watch functions (used with h5watch):
* - H5LDget_dset_dims()
* - H5LDget_dset_elmts()
* - H5LDget_dset_type_size()
diff --git a/hl/src/H5LTpublic.h b/hl/src/H5LTpublic.h
index d1684fd..15cd845 100644
--- a/hl/src/H5LTpublic.h
+++ b/hl/src/H5LTpublic.h
@@ -35,7 +35,11 @@ typedef enum H5LT_lang_t {
extern "C" {
#endif
-/**\defgroup H5LT Lite
+/** \page H5LT_UG The HDF5 High Level Lite
+ * @todo Under Construction
+ */
+
+/**\defgroup H5LT HDF5 Lite APIs (H5LT,H5LD)
* <em>Functions used to simplify creating and manipulating datasets,
* attributes and other features (H5LT, H5LD)</em>
*
@@ -57,87 +61,93 @@ extern "C" {
*
* <table>
* <tr valign="top"><td style="border: none;">
+ *
* - Dataset Functions
* - Make dataset functions
- * - \ref H5LTmake_dataset
- * - \ref H5LTmake_dataset_char
- * - \ref H5LTmake_dataset_short
- * - \ref H5LTmake_dataset_int
- * - \ref H5LTmake_dataset_long
- * - \ref H5LTmake_dataset_float
- * - \ref H5LTmake_dataset_double
- * - \ref H5LTmake_dataset_string
+ * - \ref H5LTmake_dataset
+ * - \ref H5LTmake_dataset_char
+ * - \ref H5LTmake_dataset_short
+ * - \ref H5LTmake_dataset_int
+ * - \ref H5LTmake_dataset_long
+ * - \ref H5LTmake_dataset_float
+ * - \ref H5LTmake_dataset_double
+ * - \ref H5LTmake_dataset_string
*
* - Read dataset functions
- * - \ref H5LTread_dataset
- * - \ref H5LTread_dataset_char
- * - \ref H5LTread_dataset_short
- * - \ref H5LTread_dataset_int
- * - \ref H5LTread_dataset_long
- * - \ref H5LTread_dataset_float
- * - \ref H5LTread_dataset_double
- * - \ref H5LTread_dataset_string
+ * - \ref H5LTread_dataset
+ * - \ref H5LTread_dataset_char
+ * - \ref H5LTread_dataset_short
+ * - \ref H5LTread_dataset_int
+ * - \ref H5LTread_dataset_long
+ * - \ref H5LTread_dataset_float
+ * - \ref H5LTread_dataset_double
+ * - \ref H5LTread_dataset_string
*
* - Query dataset functions
- * - \ref H5LTfind_dataset
- * - \ref H5LTget_dataset_ndims
- * - \ref H5LTget_dataset_info
+ * - \ref H5LTfind_dataset
+ * - \ref H5LTget_dataset_ndims
+ * - \ref H5LTget_dataset_info
*
* - Dataset watch functions
- * - \ref H5LDget_dset_dims
- * - \ref H5LDget_dset_elmts
- * - \ref H5LDget_dset_type_size
+ * - \ref H5LDget_dset_dims
+ * - \ref H5LDget_dset_elmts
+ * - \ref H5LDget_dset_type_size
+ *
* </td><td style="border: none;">
+ *
* - Attribute Functions
* - Set attribute functions
- * - \ref H5LTset_attribute_string
- * - \ref H5LTset_attribute_char
- * - \ref H5LTset_attribute_uchar
- * - \ref H5LTset_attribute_short
- * - \ref H5LTset_attribute_ushort
- * - \ref H5LTset_attribute_int
- * - \ref H5LTset_attribute_uint
- * - \ref H5LTset_attribute_long
- * - \ref H5LTset_attribute_long_long
- * - \ref H5LTset_attribute_ulong
- * - \ref H5LTset_attribute_ullong
- * - \ref H5LTset_attribute_float
- * - \ref H5LTset_attribute_double
- * - <code>H5LTset_attribute_f</code> (fortran ONLY)
+ * - \ref H5LTset_attribute_string
+ * - \ref H5LTset_attribute_char
+ * - \ref H5LTset_attribute_uchar
+ * - \ref H5LTset_attribute_short
+ * - \ref H5LTset_attribute_ushort
+ * - \ref H5LTset_attribute_int
+ * - \ref H5LTset_attribute_uint
+ * - \ref H5LTset_attribute_long
+ * - \ref H5LTset_attribute_long_long
+ * - \ref H5LTset_attribute_ulong
+ * - \ref H5LTset_attribute_ullong
+ * - \ref H5LTset_attribute_float
+ * - \ref H5LTset_attribute_double
+ * - <code>H5LTset_attribute_f</code> (fortran ONLY)
*
* - Get attribute functions
- * - \ref H5LTget_attribute
- * - \ref H5LTget_attribute_string
- * - \ref H5LTget_attribute_char
- * - \ref H5LTget_attribute_uchar
- * - \ref H5LTget_attribute_short
- * - \ref H5LTget_attribute_ushort
- * - \ref H5LTget_attribute_int
- * - \ref H5LTget_attribute_uint
- * - \ref H5LTget_attribute_long
- * - \ref H5LTget_attribute_long_long
- * - \ref H5LTget_attribute_ulong
- * - \ref H5LTget_attribute_ullong
- * - \ref H5LTget_attribute_float
- * - \ref H5LTget_attribute_double
+ * - \ref H5LTget_attribute
+ * - \ref H5LTget_attribute_string
+ * - \ref H5LTget_attribute_char
+ * - \ref H5LTget_attribute_uchar
+ * - \ref H5LTget_attribute_short
+ * - \ref H5LTget_attribute_ushort
+ * - \ref H5LTget_attribute_int
+ * - \ref H5LTget_attribute_uint
+ * - \ref H5LTget_attribute_long
+ * - \ref H5LTget_attribute_long_long
+ * - \ref H5LTget_attribute_ulong
+ * - \ref H5LTget_attribute_ullong
+ * - \ref H5LTget_attribute_float
+ * - \ref H5LTget_attribute_double
*
* - Query attribute functions
- * - \ref H5LTfind_attribute
- * - \ref H5LTget_attribute_info
- * - \ref H5LTget_attribute_ndims
+ * - \ref H5LTfind_attribute
+ * - \ref H5LTget_attribute_info
+ * - \ref H5LTget_attribute_ndims
+ *
* </td><td style="border: none;">
+ *
* - Datatype Functions
* - Datatype translation functions
- * - \ref H5LTtext_to_dtype
- * - \ref H5LTdtype_to_text
+ * - \ref H5LTtext_to_dtype
+ * - \ref H5LTdtype_to_text
*
* - File image function
* - Open file image function
- * - \ref H5LTopen_file_image
+ * - \ref H5LTopen_file_image
*
* - Path and object function
* - Query path and object function
- * - \ref H5LTpath_valid
+ * - \ref H5LTpath_valid
+ *
* </td></tr>
* </table>
*
@@ -1510,7 +1520,7 @@ H5_HLDLL herr_t H5LTfind_attribute(hid_t loc_id, const char *name);
* indicating the file’s root group, followed by the members
* - A relative path with respect to \p loc_id
* - A dot (\c .), if \p loc_id is the object identifier for
- * the object itself
+ * the object itself.
*
* If \p path is an absolute path, then \p loc_id can be an
* identifier for any object in the file as it is used only to
diff --git a/hl/src/H5PTpublic.h b/hl/src/H5PTpublic.h
index 04741ac..6552aa9 100644
--- a/hl/src/H5PTpublic.h
+++ b/hl/src/H5PTpublic.h
@@ -18,7 +18,11 @@
extern "C" {
#endif
-/**\defgroup H5PT Packet Table
+/** \page H5PT_UG The HDF5 High Level Packet Table
+ * @todo Under Construction
+ */
+
+/**\defgroup H5PT HDF5 Packet Table APIs (H5PT)
*
* <em>Creating and manipulating HDF5 datasets to support append-
* and read-only operations on table data (H5PT)</em>
@@ -210,7 +214,7 @@ H5_HLDLL herr_t H5PTclose(hid_t table_id);
* Level 0 is faster but offers the least compression;
* level 9 is slower but offers maximum compression.
* A setting of -1 indicates that no compression is desired.
-
+ *
*/
/* This function may be removed from the packet table in release 1.8.19. */
H5_HLDLL hid_t H5PTcreate_fl(hid_t loc_id, const char *dset_name, hid_t dtype_id, hsize_t chunk_size,
diff --git a/hl/src/H5TBpublic.h b/hl/src/H5TBpublic.h
index 9ad8e08..44b122c 100644
--- a/hl/src/H5TBpublic.h
+++ b/hl/src/H5TBpublic.h
@@ -18,7 +18,11 @@
extern "C" {
#endif
-/**\defgroup H5TB Table
+/** \page H5TB_UG The HDF5 High Level Table
+ * @todo Under Construction
+ */
+
+/**\defgroup H5TB HDF5 Table APIs (H5TB)
*
* <em>Creating and manipulating HDF5 datasets intended to be
* interpreted as tables (H5TB)</em>
@@ -656,12 +660,10 @@ H5_HLDLL herr_t H5TBAget_title(hid_t loc_id, char *table_title);
* \return A return value of 0 indicates a fill value is not present.
* \return A return value <0 indicates an error.
*
- *
* \details H5TBget_fill() reads the table attribute fill values into
* the buffer \p dst_buf for the table specified by \p dset_id
* and \p dset_name located in \p loc_id.
*
- *
* \par Example
* \include H5TBAget_fill.c
*
diff --git a/java/examples/groups/H5Ex_G_Visit.java b/java/examples/groups/H5Ex_G_Visit.java
index d14ded6..1f2f9a1 100644
--- a/java/examples/groups/H5Ex_G_Visit.java
+++ b/java/examples/groups/H5Ex_G_Visit.java
@@ -15,7 +15,7 @@
using H5Ovisit and H5Lvisit. The program prints all of
the objects in the file specified in FILE, then prints all
of the links in that file. The default file used by this
- example implements the structure described in the User's
+ example implements the structure described in the User
Guide, chapter 4, figure 26.
************************************************************/
package examples.groups;
diff --git a/java/src/Makefile.am b/java/src/Makefile.am
index 5bb72ad..0076932 100644
--- a/java/src/Makefile.am
+++ b/java/src/Makefile.am
@@ -108,7 +108,6 @@ hdf5_java_JAVA = \
${pkgpath}/structs/H5AC_cache_config_t.java \
${pkgpath}/H5.java \
${pkgpath}/HDF5Constants.java \
- ${pkgpath}/HDF5GroupInfo.java \
${pkgpath}/HDFArray.java \
${pkgpath}/HDFNativeData.java
@@ -124,7 +123,7 @@ DOCTITLE = '<h1>HDF5 Java Wrapper</h1>'
SRCDIR = '$(pkgpath)'
docs:
- $(JAVADOC) -sourcepath $(srcdir) -d javadoc -use -splitIndex -windowtitle $(WINDOWTITLE) -doctitle $(DOCTITLE) -J-Xmx180m -verbose -overview $(top_srcdir)/java/src/hdf/overview.html -classpath $(CLASSPATH_ENV) hdf.hdf5lib
+ $(JAVADOC) -sourcepath $(srcdir) -d javadoc -Xdoclint:none -use -splitIndex -windowtitle $(WINDOWTITLE) -doctitle $(DOCTITLE) -J-Xmx180m -verbose -overview $(top_srcdir)/java/src/hdf/overview.html -classpath $(CLASSPATH_ENV) hdf.hdf5lib
CLEANFILES = classhdf5_java.stamp $(jarfile) $(JAVAROOT)/$(pkgpath)/callbacks/*.class $(JAVAROOT)/$(pkgpath)/exceptions/*.class $(JAVAROOT)/$(pkgpath)/structs/*.class $(JAVAROOT)/$(pkgpath)/*.class
diff --git a/java/src/hdf/hdf5lib/CMakeLists.txt b/java/src/hdf/hdf5lib/CMakeLists.txt
index 7c9cc4b..4fb0e0a 100644
--- a/java/src/hdf/hdf5lib/CMakeLists.txt
+++ b/java/src/hdf/hdf5lib/CMakeLists.txt
@@ -101,7 +101,6 @@ set (HDF5_JAVADOC_HDF_HDF5_STRUCTS_SOURCES
set (HDF5_JAVA_HDF_HDF5_SOURCES
HDFArray.java
HDF5Constants.java
- HDF5GroupInfo.java
HDFNativeData.java
H5.java
)
diff --git a/java/src/hdf/hdf5lib/H5.java b/java/src/hdf/hdf5lib/H5.java
index 98589d9..f06163e 100644
--- a/java/src/hdf/hdf5lib/H5.java
+++ b/java/src/hdf/hdf5lib/H5.java
@@ -59,55 +59,55 @@ import hdf.hdf5lib.structs.H5O_native_info_t;
import hdf.hdf5lib.structs.H5O_token_t;
/**
+ * @page HDF5LIB HDF5 Java API Package
* This class is the Java interface for the HDF5 library.
* <p>
* This code is the called by Java programs to access the entry points of the HDF5 library. Each routine wraps
* a single HDF5 entry point, generally with the arguments and return codes analogous to the C interface.
* <p>
- * For details of the HDF5 library, see the HDF5 Documentation at:
- * <a href="http://hdfgroup.org/HDF5/">http://hdfgroup.org/HDF5/</a>
+ * For details of the HDF5 library, @see @ref RM
* <hr>
* <p>
* <b>Mapping of arguments for Java</b>
*
* <p>
* In general, arguments to the HDF Java API are straightforward translations from the 'C' API described in
- * the HDF Reference Manual.
+ * the @ref RM.
*
* <table border=1>
- * <caption><b>HDF-5 C types to Java types</b> </caption>
+ * <caption><b>HDF5 C types to Java types</b> </caption>
* <tr>
- * <td><b>HDF-5</b></td>
+ * <td><b>HDF5</b></td>
* <td><b>Java</b></td>
* </tr>
* <tr>
- * <td>H5T_NATIVE_INT</td>
+ * <td>@ref H5T_NATIVE_INT</td>
* <td>int, Integer</td>
* </tr>
* <tr>
- * <td>H5T_NATIVE_SHORT</td>
+ * <td>@ref H5T_NATIVE_SHORT</td>
* <td>short, Short</td>
* </tr>
* <tr>
- * <td>H5T_NATIVE_FLOAT</td>
+ * <td>@ref H5T_NATIVE_FLOAT</td>
* <td>float, Float</td>
* </tr>
* <tr>
- * <td>H5T_NATIVE_DOUBLE</td>
+ * <td>@ref H5T_NATIVE_DOUBLE</td>
* <td>double, Double</td>
* </tr>
* <tr>
- * <td>H5T_NATIVE_CHAR</td>
+ * <td>@ref H5T_NATIVE_CHAR</td>
* <td>byte, Byte</td>
* </tr>
* <tr>
- * <td>H5T_C_S1</td>
+ * <td>@ref H5T_C_S1</td>
* <td>java.lang.String</td>
* </tr>
* <tr>
- * <td>void * <BR>
+ * <td>void * <br />
* (i.e., pointer to `Any')</td>
- * <td>Special -- see HDFArray</td>
+ * <td>Special -- see @ref HDFARRAY</td>
* </tr>
* </table>
* <b>General Rules for Passing Arguments and Results</b>
@@ -116,17 +116,17 @@ import hdf.hdf5lib.structs.H5O_token_t;
* for arrays, which are discussed below.
* <p>
* The <i>return value</i> of Java methods is also the analogous type, as above. A major exception to that
- * rule is that all HDF functions that return SUCCEED/FAIL are declared <i>boolean</i> in the Java version,
- * rather than <i>int</i> as in the C. Functions that return a value or else FAIL are declared the
+ * rule is that all HDF Java functions will raise an exception upon failure in the Java version,
+ * rather than just return <i>int</i> as in the C. Functions that return a value are declared
* equivalent to the C function.
* However, in most cases the Java method will raise an exception instead of returning an error code.
- * See <a href="#ERRORS">Errors and Exceptions</a> below.
+ * @see @ref ERRORS.
* <p>
* Java does not support pass by reference of arguments, so arguments that are returned through <b>OUT</b>
* parameters must be wrapped in an object or array. The Java API for HDF consistently wraps arguments in
- * arrays.
+ * arrays. Where possible the Java function may return the OUT parameter as an object or basic type.
* <p>
- * For instance, a function that returns two integers is declared:
+ * For instance, a function that returns two integers declared as:
*
* <pre>
* h_err_t HDF5dummy( int *a1, int *a2)
@@ -137,26 +137,34 @@ import hdf.hdf5lib.structs.H5O_token_t;
* <pre>
* public synchronized static native int HDF5dummy(int args[]);
* </pre>
+ * OR
+ * <pre>
+ * public synchronized static native int[] HDF5dummy();
+ * </pre>
*
* where <i>a1</i> is <i>args[0]</i> and <i>a2</i> is <i>args[1]</i>, and would be invoked:
*
* <pre>
* H5.HDF5dummy(a);
* </pre>
+ * OR
+ * <pre>
+ * a = H5.HDF5dummy();
+ * </pre>
*
* <p>
* All the routines where this convention is used will have specific documentation of the details, given
* below.
* <p>
- * <b>Arrays</b>
+ * <b>@ref HDFARRAY</b>
* <p>
* HDF5 needs to read and write multi-dimensional arrays of any number type (and records). The HDF5 API
* describes the layout of the source and destination, and the data for the array passed as a block of
* bytes, for instance,
*
- * <pre>
- * herr_t H5Dread(long fid, long filetype, long memtype, long memspace, void * data);
- * </pre>
+ * @code
+ * herr_t H5Dread(long fid, long filetype, long memtype, long memspace, void *data);
+ * @endcode
*
* <p>
* where ``void *'' means that the data may be any valid numeric type, and is a contiguous block of bytes that
@@ -166,7 +174,7 @@ import hdf.hdf5lib.structs.H5O_token_t;
* For Java, this ``ANY'' is a problem, as the type of data must always be declared. Furthermore,
* multidimensional arrays are definitely <i>not</i> laid out contiguously in memory. It would be infeasible
* to declare a separate routine for every combination of number type and dimensionality. For that reason, the
- * <a href="./hdf.hdf5lib.HDFArray.html"><b>HDFArray</b></a> class is used to discover the type, shape, and
+ * @ref HDFARRAY <b>HDFArray</b> class is used to discover the type, shape, and
* size of the data array at run time, and to convert to and from a contiguous array of bytes in synchronized
* static native C order.
* <p>
@@ -174,88 +182,107 @@ import hdf.hdf5lib.structs.H5O_token_t;
* passed as an ``Object'', and the Java API will translate to and from the appropriate packed array of bytes
* needed by the C library. So the function above would be declared:
*
- * <pre>
- * public synchronized static native int H5Dread(long fid, long filetype, long memtype, long memspace,
- * Object data);
- * </pre>
- * OPEN_IDS.addElement(id);
-
+ * @code
+ * public synchronized static int H5Dread(long dataset_id, long mem_type_id, long mem_space_id,
+ * long file_space_id, long xfer_plist_id, Object obj,
+ * boolean isCriticalPinning)
+ * throws HDF5Exception, HDF5LibraryException, NullPointerException;
+ * @endcode
+ *
* and the parameter <i>data</i> can be any multi-dimensional array of numbers, such as float[][], or
* int[][][], or Double[][].
* <p>
- * <b>HDF-5 Constants</b>
+ * <b>@ref HDF5CONST</b>
* <p>
- * The HDF-5 API defines a set of constants and enumerated values. Most of these values are available to Java
- * programs via the class <a href="./hdf.hdf5lib.HDF5Constants.html"> <b>HDF5Constants</b></a>. For example,
+ * The HDF5 API defines a set of constants and enumerated values. Most of these values are available to Java
+ * programs via the class @ref HDF5CONST <b>HDF5Constants</b></a>. For example,
* the parameters for the h5open() call include two numeric values, <b><i>HDFConstants.H5F_ACC_RDWR</i></b>
* and <b><i>HDF5Constants.H5P_DEFAULT</i></b>.
* As would be expected, these numbers correspond to the C constants
- * <b><i>H5F_ACC_RDWR</i></b> and <b><i>H5P_DEFAULT</i></b>.
+ * <b><i>#H5F_ACC_RDWR</i></b> and <b><i>#H5P_DEFAULT</i></b>.
* <p>
- * The HDF-5 API defines a set of values that describe number types and sizes, such as "H5T_NATIVE_INT" and
- * "hsize_t". These values are determined at run time by the HDF-5 C library. To support these parameters,
- * the Java class <a href="./hdf.hdf5lib.HDF5CDataTypes.html"> <b>HDF5CDataTypes</b></a> looks up the values
+ * The HDF5 API defines a set of values that describe number types and sizes, such as "H5T_NATIVE_INT" and
+ * "hsize_t". These values are determined at run time by the HDF5 C library. To support these parameters,
+ * the Java HDFConstants class looks up the values
* when initiated. The values can be accessed as public variables of the Java class, such as:
*
- * <pre>
- * long data_type = HDF5CDataTypes.JH5T_NATIVE_INT;
- * </pre>
+ * @code
+ * long data_type = HDFConstants.H5T_NATIVE_INT;
+ * @endcode
*
* The Java application uses both types of constants the same way, the only difference is that the
- * <b><i>HDF5CDataTypes</i></b> may have different values on different platforms.
+ * <b><i>HDFConstants</i></b> may have different values on different platforms.
* <p>
- * <b>Error handling and Exceptions</b>
+ * <b>@ref ERRORS</b>
* <p>
- * The HDF5 error API (H5E) manages the behavior of the error stack in the HDF-5 library. This API is omitted
- * from the JHI5. Errors are converted into Java exceptions. This is totally different from the C interface,
- * but is very natural for Java programming.
- * <p>
- * The exceptions of the JHI5 are organized as sub-classes of the class
- * <a href="./hdf.hdf5lib.exceptions.HDF5Exception.html"> <b>HDF5Exception</b></a>. There are two subclasses
- * of
- * <b>HDF5Exception</b>, <a href="./hdf.hdf5lib.exceptions.HDF5LibraryException.html">
- <b>HDF5LibraryException</b></a>
- * and <a href="./hdf.hdf5lib.exceptions.HDF5JavaException.html"> <b>HDF5JavaException</b></a>. The
- * sub-classes of the former represent errors from the HDF-5 C library, while sub-classes of the latter
+ * The HDF5 error API (@ref H5E) manages the behavior of the error stack in the HDF5 library. This API is
+ * omitted from the JHI5. Errors are converted into Java exceptions. This is totally different from the C
+ * interface, but is very natural for Java programming. <p> The exceptions of the JHI5 are organized as
+ * sub-classes of the class
+ * @ref ERRORS <b>HDF5Exception</b>. There are two subclasses of
+ * <b>HDF5Exception</b>, @ref ERRORSLIB <b>HDF5LibraryException</b>
+ * and @ref ERRORSJAVA <b>HDF5JavaException</b>. The
+ * sub-classes of the former represent errors from the HDF5 C library, while sub-classes of the latter
* represent errors in the JHI5 wrapper and support code.
* <p>
* The super-class <b><i>HDF5LibraryException</i></b> implements the method '<b><i>printStackTrace()</i></b>',
- * which prints out the HDF-5 error stack, as described in the HDF-5 C API <i><b>H5Eprint()</b>.</i> This may
- * be used by Java exception handlers to print out the HDF-5 error stack.
- * <hr>
+ * which prints out the HDF5 error stack, as described in the HDF5 C API <i><b>@ref H5Eprint()</b>.</i> This
+ * may be used by Java exception handlers to print out the HDF5 error stack. <hr>
*
* @version HDF5 1.13.3 <BR>
- * <b>See also: <a href ="./hdf.hdf5lib.HDFArray.html"> hdf.hdf5lib.HDFArray</a> </b><BR>
- * <a href ="./hdf.hdf5lib.HDF5Constants.html"> hdf.hdf5lib.HDF5Constants</a><BR>
- * <a href ="./hdf.hdf5lib.HDF5CDataTypes.html"> hdf.hdf5lib.HDF5CDataTypes</a><BR>
- * <a href ="./hdf.hdf5lib.HDF5Exception.html"> hdf.hdf5lib.HDF5Exception</a><BR>
- * <a href="http://hdfgroup.org/HDF5/"> http://hdfgroup.org/HDF5"</a>
+ * <b>See also: </b>
+ * @ref HDFARRAY hdf.hdf5lib.HDFArray<br />
+ * @ref HDF5CONST hdf.hdf5lib.HDF5Constants<br />
+ * @ref ERRORS hdf.hdf5lib.HDF5Exception<br />
+ * <a href="https://hdfgroup.org/HDF5/">HDF5</a>
+ *
+ * For details of the HDF5 library, @see @ref RM
+ */
+
+/**
+ * This class is the Java interface for the HDF5 library.
+ *
+ * @defgroup JH5 HDF5 Library Java Interface
+ *
+ * This code is the called by Java programs to access the entry points of the HDF5 library. Each routine wraps
+ * a single HDF5 entry point, generally with the arguments and return codes analogous to the C interface.
+ *
+ * @see H5, C-API
+ *
+ * @see @ref H5_UG, User Guide
*
*/
public class H5 implements java.io.Serializable {
/**
- *
+ * Serialization ID
*/
private static final long serialVersionUID = 6129888282117053288L;
private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(H5.class);
/**
- * The version number of the HDF5 library:
- * LIB_VERSION[0]: The major version of the library.
- * LIB_VERSION[1]: The minor version of the library.
- * LIB_VERSION[2]: The release number of the library.
+ * @ingroup JH5
*
+ * The version number of the HDF5 library:
+ * <ul>
+ * <li>LIB_VERSION[0]: The major version of the library.</li>
+ * <li>LIB_VERSION[1]: The minor version of the library.</li>
+ * <li>LIB_VERSION[2]: The release number of the library.</li>
+ * </ul>
* Make sure to update the versions number when a different library is used.
*/
- public final static int LIB_VERSION[] = {1, 13, 2};
+ public final static int LIB_VERSION[] = {1, 13, 3};
/**
+ * @ingroup JH5
+ *
* add system property to load library by path
*/
public final static String H5PATH_PROPERTY_KEY = "hdf.hdf5lib.H5.hdf5lib";
/**
+ * @ingroup JH5
+ *
* add system property to load library by name from library path, via System.loadLibrary()
*/
public final static String H5_LIBRARY_NAME_PROPERTY_KEY = "hdf.hdf5lib.H5.loadLibraryName";
@@ -268,6 +295,8 @@ public class H5 implements java.io.Serializable {
static { loadH5Lib(); }
/**
+ * @ingroup JH5
+ *
* load native library
*/
public static void loadH5Lib()
@@ -372,6 +401,8 @@ public class H5 implements java.io.Serializable {
// ////////////////////////////////////////////////////////////
/**
+ * @ingroup JH5
+ *
* Get number of open IDs.
*
* @return Returns a count of open IDs
@@ -379,6 +410,8 @@ public class H5 implements java.io.Serializable {
public final static int getOpenIDCount() { return OPEN_IDS.size(); }
/**
+ * @ingroup JH5
+ *
* Get the open IDs
*
* @return Returns a collection of open IDs
@@ -386,6 +419,8 @@ public class H5 implements java.io.Serializable {
public final static Collection<Long> getOpenIDs() { return OPEN_IDS; }
/**
+ * @ingroup JH5
+ *
* H5check_version verifies that the arguments match the version numbers compiled into the library.
*
* @param majnum
@@ -397,47 +432,55 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful. Upon failure (when the versions do not match), this
* function causes the application to abort (i.e., crash)
*
- * See C API function: herr_t H5check_version()
+ * See C API function: @ref herr_t H5check_version(unsigned majnum, unsigned minnum, unsigned relnum)
**/
public synchronized static native int H5check_version(int majnum, int minnum, int relnum);
/**
+ * @ingroup JH5
+ *
* H5close flushes all data to disk, closes all file identifiers, and cleans up all memory used by the
* library.
*
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5close() throws HDF5LibraryException;
/**
+ * @ingroup JH5
+ *
* H5open initialize the library.
*
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5open() throws HDF5LibraryException;
/**
+ * @ingroup JH5
+ *
* H5dont_atexit indicates to the library that an atexit() cleanup routine should not be installed. In
* order to be effective, this routine must be called before any other HDF function calls, and must be
* called each time the library is loaded/linked into the application (the first time and after it's been
- * unloaded). <P> This is called by the static initializer, so this should never need to be explicitly
+ * unloaded). <p> This is called by the static initializer, so this should never need to be explicitly
* called by a Java program.
*
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
private synchronized static native int H5dont_atexit() throws HDF5LibraryException;
/**
- * Turn off error handling. By default, the C library prints the error stack of the HDF-5 C library on
+ * @ingroup JH5
+ *
+ * Turn off error handling. By default, the C library prints the error stack of the HDF5 C library on
* stdout. This behavior may be disabled by calling H5error_off().
*
* @return a non-negative value if successful
@@ -445,29 +488,35 @@ public class H5 implements java.io.Serializable {
public synchronized static native int H5error_off();
/**
- * Turn on error handling. By default, the C library prints the error stack of the HDF-5 C library on
+ * @ingroup JH5
+ *
+ * Turn on error handling. By default, the C library prints the error stack of the HDF5 C library on
* stdout. This behavior may be re-enabled by calling H5error_on().
*/
public synchronized static native void H5error_on();
/**
+ * @ingroup JH5
+ *
* H5garbage_collect collects on all free-lists of all types.
*
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5garbage_collect() throws HDF5LibraryException;
/**
+ * @ingroup JH5
+ *
* H5get_libversion retrieves the major, minor, and release numbers of the version of the HDF library
* which is linked to the application.
*
* @param libversion
* The version information of the HDF library.
*
- * <pre>
+ * <pre>
* libversion[0] = The major version of the library.
* libversion[1] = The minor version of the library.
* libversion[2] = The release number of the library.
@@ -475,11 +524,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful, along with the version information.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5get_libversion(int[] libversion) throws HDF5LibraryException;
/**
+ * @ingroup JH5
+ *
* H5set_free_list_limits
* Sets limits on the different kinds of free lists. Setting a value
* of -1 for a limit means no limit of that type. These limits are global
@@ -506,7 +557,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful, along with the version information.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5set_free_list_limits(int reg_global_lim, int reg_list_lim,
int arr_global_lim, int arr_list_lim,
@@ -514,6 +565,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5
+ *
* H5export_dataset is a utility function to save data in a file.
*
* @param file_export_name
@@ -529,13 +582,15 @@ public class H5 implements java.io.Serializable {
* 3 - export data as binary Big Endian.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5export_dataset(String file_export_name, long file_id,
String object_path, int binary_order)
throws HDF5LibraryException;
/**
+ * @ingroup JH5
+ *
* H5export_attribute is a utility function to save data in a file.
*
* @param file_export_name
@@ -551,13 +606,15 @@ public class H5 implements java.io.Serializable {
* 3 - export data as binary Big Endian.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5export_attribute(String file_export_name, long dataset_id,
String attribute_name, int binary_order)
throws HDF5LibraryException;
/**
+ * @ingroup JH5
+ *
* H5is_library_threadsafe Checks to see if the library was built with thread-safety enabled.
*
* @return true if hdf5 library implements threadsafe
@@ -572,11 +629,23 @@ public class H5 implements java.io.Serializable {
// ////////////////////////////////////////////////////////////
// //
- // H5A: HDF5 1.8 Attribute Interface API Functions //
+ // H5A: HDF5 Attribute Interface API Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5A Java Attribute (H5A) Interface
+ *
+ * An HDF5 attribute is a small metadata object describing the nature and/or intended usage of a primary
+ *data object. A primary data object may be a dataset, group, or committed datatype.
+ *
+ * @see H5A, C-API
+ *
+ * @see @ref H5A_UG, User Guide
+ **/
/**
+ * @ingroup JH5A
+ *
* H5Aclose terminates access to the attribute specified by its identifier, attr_id.
*
* @param attr_id
@@ -585,7 +654,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Aclose(long attr_id) throws HDF5LibraryException
{
@@ -601,6 +670,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Aclose(long attr_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Acopy copies the content of one attribute to another.
*
* @param src_aid
@@ -611,11 +682,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Acopy(long src_aid, long dst_aid) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Acreate creates an attribute, attr_name, which is attached to the object specified by the identifier
* loc_id.
*
@@ -635,7 +708,7 @@ public class H5 implements java.io.Serializable {
* @return An attribute identifier if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* Name is null.
**/
@@ -652,6 +725,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Acreate2 an attribute, attr_name, which is attached to the object specified by the identifier loc_id.
*
* @see public static long H5Acreate( long loc_id, String attr_name, long type_id, long space_id, long
@@ -662,6 +737,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Acreate_by_name creates an attribute, attr_name, which is attached to the object specified by loc_id
* and obj_name.
*
@@ -685,7 +762,7 @@ public class H5 implements java.io.Serializable {
* @return An attribute identifier if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -709,6 +786,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Adelete removes the attribute specified by its name, name, from a dataset, group, or named datatype.
*
* @param loc_id
@@ -719,7 +798,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -727,6 +806,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Adelete_by_idx removes an attribute, specified by its location in an index, from an object.
*
* @param loc_id
@@ -743,7 +824,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* obj_name is null.
**/
@@ -752,6 +833,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Adelete_by_name removes the attribute attr_name from an object specified by location and name, loc_id
* and obj_name, respectively.
*
@@ -767,7 +850,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -776,6 +859,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aexists determines whether the attribute attr_name exists on the object specified by obj_id.
*
* @param obj_id
@@ -786,7 +871,7 @@ public class H5 implements java.io.Serializable {
* @return boolean true if an attribute with a given name exists.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* attr_name is null.
**/
@@ -794,6 +879,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aexists_by_name determines whether the attribute attr_name exists on an object. That object is
* specified by its location and name, loc_id and obj_name, respectively.
*
@@ -809,7 +896,7 @@ public class H5 implements java.io.Serializable {
* @return boolean true if an attribute with a given name exists, otherwise returns false.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -818,6 +905,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_info retrieves attribute information, by attribute identifier.
*
* @param attr_id
@@ -826,11 +915,13 @@ public class H5 implements java.io.Serializable {
* @return A buffer(H5A_info_t) for Attribute information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native H5A_info_t H5Aget_info(long attr_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_info_by_idx Retrieves attribute information, by attribute index position.
*
* @param loc_id
@@ -849,7 +940,7 @@ public class H5 implements java.io.Serializable {
* @return A buffer(H5A_info_t) for Attribute information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* obj_name is null.
**/
@@ -859,6 +950,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_info_by_name Retrieves attribute information, by attribute name.
*
* @param loc_id
@@ -873,7 +966,7 @@ public class H5 implements java.io.Serializable {
* @return A buffer(H5A_info_t) for Attribute information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* obj_name is null.
**/
@@ -882,6 +975,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_name retrieves the name of an attribute specified by the identifier, attr_id.
*
* @param attr_id
@@ -890,11 +985,13 @@ public class H5 implements java.io.Serializable {
* @return String for Attribute name.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Aget_name(long attr_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_name_by_idx retrieves the name of an attribute that is attached to an object, which is specified
* by its location and name, loc_id and obj_name, respectively.
*
@@ -923,6 +1020,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_space retrieves a copy of the dataspace for an attribute.
*
* @param attr_id
@@ -931,7 +1030,7 @@ public class H5 implements java.io.Serializable {
* @return attribute dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Aget_space(long attr_id) throws HDF5LibraryException
{
@@ -947,6 +1046,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Aget_space(long attr_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_storage_size returns the amount of storage that is required for the specified attribute,
* attr_id.
*
@@ -956,11 +1057,13 @@ public class H5 implements java.io.Serializable {
* @return the amount of storage size allocated for the attribute; otherwise returns 0 (zero)
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Aget_storage_size(long attr_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_type retrieves a copy of the datatype for an attribute.
*
* @param attr_id
@@ -969,7 +1072,7 @@ public class H5 implements java.io.Serializable {
* @return a datatype identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Aget_type(long attr_id) throws HDF5LibraryException
{
@@ -985,6 +1088,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Aget_type(long attr_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Aopen opens an existing attribute, attr_name, that is attached to an object specified an object
* identifier, object_id.
*
@@ -998,7 +1103,7 @@ public class H5 implements java.io.Serializable {
* @return An attribute identifier if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* Name is null.
**/
@@ -1018,6 +1123,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aopen_by_idx opens an existing attribute that is attached to an object specified by location and
* name, loc_id and obj_name, respectively
*
@@ -1039,7 +1146,7 @@ public class H5 implements java.io.Serializable {
* @return An attribute identifier if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* Name is null.
**/
@@ -1061,6 +1168,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aopen_by_name Opens an attribute for an object by object name and attribute name
*
* @param loc_id
@@ -1077,7 +1186,7 @@ public class H5 implements java.io.Serializable {
* @return Returns an attribute identifier if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* obj_name is null.
**/
@@ -1098,6 +1207,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer from the file.
*
@@ -1113,7 +1224,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1122,6 +1233,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer from the file.
*
@@ -1135,7 +1248,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1146,6 +1259,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer from the file.
*
@@ -1159,7 +1274,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1170,6 +1285,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into data object from the file.
*
@@ -1187,7 +1304,7 @@ public class H5 implements java.io.Serializable {
* @exception HDF5Exception
* Failure in the data conversion.
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null. See public synchronized static native int H5Aread( )
**/
@@ -1269,6 +1386,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of double from the file.
*
@@ -1284,7 +1403,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1293,6 +1412,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of double from the file.
*
@@ -1306,7 +1427,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1332,7 +1453,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1341,6 +1462,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of float from the file.
*
@@ -1354,7 +1477,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1365,6 +1488,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of int from the file.
*
@@ -1380,7 +1505,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1389,6 +1514,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of int from the file.
*
@@ -1402,7 +1529,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1413,6 +1540,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of long from the file.
*
@@ -1428,7 +1557,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1437,6 +1566,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of long from the file.
*
@@ -1450,7 +1581,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1461,6 +1592,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of String from the file.
*
@@ -1474,7 +1607,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1482,6 +1615,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of short from the file.
*
@@ -1497,7 +1632,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1506,6 +1641,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of shortfrom the file.
*
@@ -1519,7 +1656,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1530,6 +1667,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of variable-lenght from the file.
*
@@ -1543,7 +1682,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1551,6 +1690,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of String from the file.
*
@@ -1564,7 +1705,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1572,6 +1713,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of variable-lenght strings from the file.
*
@@ -1585,7 +1728,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1593,6 +1736,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aread reads an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is read into buffer of string from the file.
*
@@ -1606,7 +1751,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -1614,8 +1759,10 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Arename changes the name of attribute that is attached to the object specified by loc_id. The
- *attribute named old_attr_name is renamed new_attr_name.
+ * attribute named old_attr_name is renamed new_attr_name.
*
* @param loc_id
* IN: Location or object identifier; may be dataset or group
@@ -1627,7 +1774,7 @@ public class H5 implements java.io.Serializable {
* @return A non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* Name is null.
**/
@@ -1635,6 +1782,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Arename_by_name changes the name of attribute that is attached to the object specified by loc_id and
* obj_name. The attribute named old_attr_name is renamed new_attr_name.
*
@@ -1652,7 +1801,7 @@ public class H5 implements java.io.Serializable {
* @return A non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* Name is null.
**/
@@ -1661,6 +1810,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buf to the file.
*
@@ -1676,7 +1827,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1685,6 +1836,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buf to the file.
*
@@ -1698,7 +1851,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1709,6 +1862,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buf to the file.
*
@@ -1722,7 +1877,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1733,6 +1888,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from data object to the file.
*
@@ -1750,7 +1907,7 @@ public class H5 implements java.io.Serializable {
* @exception HDF5Exception
* Failure in the data conversion.
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data object is null
**/
@@ -1809,6 +1966,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of double to the file.
*
@@ -1824,7 +1983,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1833,6 +1992,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of double to the file.
*
@@ -1846,7 +2007,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1857,6 +2018,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of float to the file.
*
@@ -1872,7 +2035,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1881,6 +2044,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of float to the file.
*
@@ -1894,7 +2059,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1905,6 +2070,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of int to the file.
*
@@ -1920,7 +2087,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1929,6 +2096,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of int to the file.
*
@@ -1942,7 +2111,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1953,6 +2122,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of long to the file.
*
@@ -1968,7 +2139,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -1977,6 +2148,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of long to the file.
*
@@ -1990,7 +2163,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -2001,6 +2174,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of short to the file.
*
@@ -2016,7 +2191,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -2025,6 +2200,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of short to the file.
*
@@ -2038,7 +2215,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -2049,6 +2226,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of string to the file.
*
@@ -2062,7 +2241,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -2070,6 +2249,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite writes an attribute, specified with attr_id. The attribute's memory datatype is specified with
* mem_type_id. The entire attribute is written from buffer of variable-lenght to the file.
*
@@ -2083,7 +2264,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data is null.
**/
@@ -2091,6 +2272,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Awrite_VLStrings writes a variable length String dataset, specified by its identifier attr_id, from
* the application memory buffer buffer of variable-lenght strings into the file.
*
@@ -2106,7 +2289,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -2115,6 +2298,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aget_create_plist retrieves a copy of the attribute creation property list identifier.
*
* @param attr_id
@@ -2123,7 +2308,7 @@ public class H5 implements java.io.Serializable {
* @return identifier for the attribute's creation property list if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Aget_create_plist(long attr_id) throws HDF5LibraryException
{
@@ -2139,6 +2324,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Aget_create_plist(long attr_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5A
+ *
* H5Aiterate2 iterates over the attributes attached to a dataset, named datatype, or group, as
* specified by obj_id. For each attribute, user-provided data, op_data, with additional information
* as defined below, is passed to a user-defined function, op, which operates on that attribute.
@@ -2171,7 +2358,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -2180,6 +2367,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5A
+ *
* H5Aiterate_by_name iterates over the attributes attached to the dataset or group specified with loc_id
* and obj_name. For each attribute, user-provided data, op_data, with additional information as defined
* below, is passed to a user-defined function, op, which operates on that attribute.
@@ -2216,7 +2405,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -2262,8 +2451,17 @@ public class H5 implements java.io.Serializable {
// H5D: Datasets Interface Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5D Java Datasets (H5D) Interface
+ *
+ * @see H5D, C-API
+ *
+ * @see @ref H5D_UG, User Guide
+ **/
/**
+ * @ingroup JH5D
+ *
* H5Dcopy copies the content of one dataset to another dataset.
*
* @param src_did
@@ -2274,11 +2472,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Dcopy(long src_did, long dst_did) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dclose ends access to a dataset specified by dataset_id and releases resources used by it.
*
* @param dataset_id
@@ -2287,7 +2487,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Dclose(long dataset_id) throws HDF5LibraryException
{
@@ -2303,6 +2503,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Dclose(long dataset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dcreate creates a new dataset named name at the location specified by loc_id.
*
* @param loc_id
@@ -2323,7 +2525,7 @@ public class H5 implements java.io.Serializable {
* @return a dataset identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -2340,6 +2542,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dcreate2 creates a new dataset named name at the location specified by loc_id.
*
* @see public static int H5Dcreate(int loc_id, String name, int type_id, int space_id, int lcpl_id, int
@@ -2350,6 +2554,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dcreate_anon creates a dataset in the file specified by loc_id.
*
* @param loc_id
@@ -2366,7 +2572,7 @@ public class H5 implements java.io.Serializable {
* @return a dataset identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Dcreate_anon(long loc_id, long type_id, long space_id, long dcpl_id, long dapl_id)
throws HDF5LibraryException
@@ -2385,6 +2591,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dfill explicitly fills the dataspace selection in memory, space_id, with the fill value specified in
* fill.
*
@@ -2400,7 +2608,7 @@ public class H5 implements java.io.Serializable {
* IN: Dataspace describing memory buffer and containing the selection to be filled.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -2409,6 +2617,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dget_access_plist returns an identifier for a copy of the dataset access property list for a dataset.
*
* @param dset_id
@@ -2417,11 +2627,13 @@ public class H5 implements java.io.Serializable {
* @return a dataset access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Dget_access_plist(long dset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dget_create_plist returns an identifier for a copy of the dataset creation property list for a
* dataset.
*
@@ -2430,7 +2642,7 @@ public class H5 implements java.io.Serializable {
* @return a dataset creation property list identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Dget_create_plist(long dataset_id) throws HDF5LibraryException
{
@@ -2446,6 +2658,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Dget_create_plist(long dataset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dget_offset returns the address in the file of the dataset dset_id.
*
* @param dset_id
@@ -2454,11 +2668,13 @@ public class H5 implements java.io.Serializable {
* @return the offset in bytes.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Dget_offset(long dset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dget_space returns an identifier for a copy of the dataspace for a dataset.
*
* @param dataset_id
@@ -2467,7 +2683,7 @@ public class H5 implements java.io.Serializable {
* @return a dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Dget_space(long dataset_id) throws HDF5LibraryException
{
@@ -2483,6 +2699,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Dget_space(long dataset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dget_space_status determines whether space has been allocated for the dataset dset_id.
*
* @param dset_id
@@ -2491,11 +2709,13 @@ public class H5 implements java.io.Serializable {
* @return the space allocation status
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Dget_space_status(long dset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dget_storage_size returns the amount of storage that is required for the dataset.
*
* @param dataset_id
@@ -2504,12 +2724,14 @@ public class H5 implements java.io.Serializable {
* @return he amount of storage space allocated for the dataset.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Dget_storage_size(long dataset_id)
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5D
+ *
* H5Dget_type returns an identifier for a copy of the datatype for a dataset.
*
* @param dataset_id
@@ -2518,7 +2740,7 @@ public class H5 implements java.io.Serializable {
* @return a datatype identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Dget_type(long dataset_id) throws HDF5LibraryException
{
@@ -2534,6 +2756,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Dget_type(long dataset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Diterate iterates over all the data elements in the memory buffer buf, executing the callback
* function operator once for each such data element.
*
@@ -2552,7 +2776,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -2561,6 +2785,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dopen opens the existing dataset specified by a location identifier and name, loc_id and name,
* respectively.
*
@@ -2574,7 +2800,7 @@ public class H5 implements java.io.Serializable {
* @return a dataset identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -2591,6 +2817,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dopen2 opens the existing dataset specified by a location identifier and name, loc_id and name,
* respectively.
*
@@ -2600,6 +2828,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer buf.
*
@@ -2621,7 +2851,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2631,6 +2861,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer buf.
*
@@ -2650,7 +2882,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2662,6 +2894,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer buf.
*
@@ -2681,7 +2915,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2693,6 +2927,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application data object.
*
@@ -2716,7 +2952,7 @@ public class H5 implements java.io.Serializable {
* @exception HDF5Exception
* Failure in the data conversion.
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data object is null.
**/
@@ -2808,6 +3044,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of type double.
*
@@ -2829,7 +3067,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2839,6 +3077,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of type double.
*
@@ -2858,7 +3098,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2870,6 +3110,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of float.
*
@@ -2891,7 +3133,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2901,6 +3143,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of float.
*
@@ -2920,7 +3164,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2932,6 +3176,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of int.
*
@@ -2953,7 +3199,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2963,6 +3209,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of int.
*
@@ -2982,7 +3230,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -2994,6 +3242,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of long.
*
@@ -3015,7 +3265,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3025,6 +3275,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of long.
*
@@ -3044,7 +3296,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3056,6 +3308,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of string.
*
@@ -3075,7 +3329,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3085,6 +3339,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of short.
*
@@ -3106,7 +3362,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3116,6 +3372,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of short.
*
@@ -3135,7 +3393,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3147,6 +3405,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of variable-lenght.
*
@@ -3166,7 +3426,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3175,6 +3435,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of string.
*
@@ -3194,7 +3456,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3203,6 +3465,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dread reads a (partial) dataset, specified by its identifier dataset_id, from the file into the
* application memory buffer of variable-lenght strings.
*
@@ -3222,7 +3486,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data buffer is null.
**/
@@ -3232,6 +3496,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dset_extent sets the current dimensions of the chunked dataset dset_id to the sizes specified in
* size.
*
@@ -3241,7 +3507,7 @@ public class H5 implements java.io.Serializable {
* IN: Array containing the new magnitude of each dimension of the dataset.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
**/
@@ -3249,6 +3515,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dvlen_get_buf_size determines the number of bytes required to store the VL data from the dataset,
* using the space_id for the selection in the dataset on disk and the type_id for the memory
* representation of the VL data in memory.
@@ -3263,7 +3531,7 @@ public class H5 implements java.io.Serializable {
* @return the size in bytes of the memory buffer required to store the VL data.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -3271,6 +3539,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Dvlen_reclaim reclaims buffer used for VL data.
*
* @param type_id
@@ -3285,7 +3555,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
*
@@ -3297,6 +3567,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3318,7 +3590,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3328,6 +3600,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3347,7 +3621,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3359,6 +3633,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3378,7 +3654,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3390,6 +3666,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory data object into the file.
*
@@ -3413,7 +3691,7 @@ public class H5 implements java.io.Serializable {
* @exception HDF5Exception
* Failure in the data conversion.
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* data object is null.
**/
@@ -3485,6 +3763,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3506,7 +3786,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3516,6 +3796,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3535,7 +3817,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3548,6 +3830,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3569,7 +3853,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3579,6 +3863,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3598,7 +3884,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3610,6 +3896,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3631,7 +3919,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3641,6 +3929,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3660,7 +3950,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3672,6 +3962,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3693,7 +3985,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3703,6 +3995,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3722,7 +4016,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3734,6 +4028,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3755,7 +4051,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3765,6 +4061,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3784,7 +4082,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3796,6 +4094,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3815,7 +4115,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3825,6 +4125,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite writes a (partial) dataset, specified by its identifier dataset_id, from the application
* memory buffer into the file.
*
@@ -3844,7 +4146,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3853,6 +4155,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dwrite_VLStrings writes a (partial) variable length String dataset, specified by its identifier
* dataset_id, from the application memory buffer buf into the file.
*
@@ -3874,7 +4178,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -3885,6 +4189,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5D
+ *
* H5Dflush causes all buffers associated with a dataset to be immediately flushed to disk without
* removing the data from the cache.
*
@@ -3892,11 +4198,13 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the dataset to be flushed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Dflush(long dset_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5D
+ *
* H5Drefresh causes all buffers associated with a dataset to be cleared and immediately re-loaded with
* updated contents from disk. This function essentially closes the dataset, evicts all metadata
* associated with it from the cache, and then re-opens the dataset. The reopened dataset is automatically
@@ -3906,7 +4214,7 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the dataset to be refreshed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Drefresh(long dset_id) throws HDF5LibraryException;
@@ -3926,8 +4234,18 @@ public class H5 implements java.io.Serializable {
// H5E: Error Stack //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ *
+ * @defgroup JH5E Java Error (H5E) Interface
+ *
+ * @see H5E, C-API
+ *
+ * @see @ref H5E_UG, User Guide
+ */
/**
+ * @ingroup JH5E
+ *
* H5Eauto_is_v2 determines whether the error auto reporting function for an error stack conforms to the
* H5E_auto2_t typedef or the H5E_auto1_t typedef.
*
@@ -3938,19 +4256,21 @@ public class H5 implements java.io.Serializable {
* H5E_auto1_t.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Eauto_is_v2(long stack_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Eclear clears the error stack for the current thread. H5Eclear can fail if there are problems
* initializing the library. <p> This may be used by exception handlers to assure that the error condition
- * in the HDF-5 library has been reset.
+ * in the HDF5 library has been reset.
*
* @return Returns a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Eclear() throws HDF5LibraryException
{
@@ -3959,6 +4279,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5E
+ *
* H5Eclear clears the error stack specified by estack_id, or, if estack_id is set to H5E_DEFAULT, the
* error stack for the current thread.
*
@@ -3966,11 +4288,13 @@ public class H5 implements java.io.Serializable {
* IN: Error stack identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static void H5Eclear(long stack_id) throws HDF5LibraryException { H5Eclear2(stack_id); }
/**
+ * @ingroup JH5E
+ *
* H5Eclear2 clears the error stack specified by estack_id, or, if estack_id is set to H5E_DEFAULT, the
* error stack for the current thread.
*
@@ -3978,33 +4302,39 @@ public class H5 implements java.io.Serializable {
* IN: Error stack identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Eclear2(long stack_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Eclose_msg closes an error message identifier, which can be either a major or minor message.
*
* @param err_id
* IN: Error message identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Eclose_msg(long err_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Eclose_stack closes the object handle for an error stack and releases its resources.
*
* @param stack_id
* IN: Error stack identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Eclose_stack(long stack_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Ecreate_msg adds an error message to an error class defined by client library or application program.
*
* @param cls_id
@@ -4017,7 +4347,7 @@ public class H5 implements java.io.Serializable {
* @return a message identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* msg is null.
**/
@@ -4025,16 +4355,20 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5E
+ *
* H5Ecreate_stack creates a new empty error stack and returns the new stack's identifier.
*
* @return an error stack identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Ecreate_stack() throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Eget_class_name retrieves the name of the error class specified by the class identifier.
*
* @param class_id
@@ -4043,23 +4377,27 @@ public class H5 implements java.io.Serializable {
* @return the name of the error class
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Eget_class_name(long class_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5E
+ *
* H5Eget_current_stack copies the current error stack and returns an error stack identifier for the new
* copy.
*
* @return an error stack identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Eget_current_stack() throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Eset_current_stack replaces the content of the current error stack with a copy of the content of the
* error stack specified by estack_id.
*
@@ -4067,11 +4405,13 @@ public class H5 implements java.io.Serializable {
* IN: Error stack identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Eset_current_stack(long stack_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Eget_msg retrieves the error message including its length and type.
*
* @param msg_id
@@ -4082,12 +4422,14 @@ public class H5 implements java.io.Serializable {
* @return the error message
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Eget_msg(long msg_id, int[] type_list)
throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Eget_num retrieves the number of error records in the error stack specified by estack_id (including
* major, minor messages and description).
*
@@ -4097,12 +4439,14 @@ public class H5 implements java.io.Serializable {
* @return the number of error messages
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Eget_num(long stack_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5E
+ *
* H5Eprint2 prints the error stack specified by estack_id on the specified stream, stream.
*
* @param stack_id
@@ -4112,12 +4456,14 @@ public class H5 implements java.io.Serializable {
* IN: File pointer, or stderr if null.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Eprint2(long stack_id, Object stream)
throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Epop deletes the number of error records specified in count from the top of the error stack specified
* by estack_id (including major, minor messages and description).
*
@@ -4127,11 +4473,13 @@ public class H5 implements java.io.Serializable {
* IN: Version of the client library or application to which the error class belongs.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Epop(long stack_id, long count) throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Epush pushes a new error record onto the error stack specified by estack_id.
*
* @param stack_id
@@ -4152,7 +4500,7 @@ public class H5 implements java.io.Serializable {
* IN: Error description string.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* file, func, or msg is null.
**/
@@ -4162,6 +4510,8 @@ public class H5 implements java.io.Serializable {
H5Epush2(stack_id, file, func, line, cls_id, maj_id, min_id, msg);
}
/**
+ * @ingroup JH5E
+ *
* H5Epush2 pushes a new error record onto the error stack specified by estack_id.
*
* @param stack_id
@@ -4182,7 +4532,7 @@ public class H5 implements java.io.Serializable {
* IN: Error description string.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* file, func, or msg is null.
**/
@@ -4191,6 +4541,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5E
+ *
* H5Eregister_class registers a client library or application program to the HDF5 error API so that the
* client library or application program can report errors together with HDF5 library.
*
@@ -4204,7 +4556,7 @@ public class H5 implements java.io.Serializable {
* @return a class identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -4212,17 +4564,21 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5E
+ *
* H5Eunregister_class removes the error class specified by class_id.
*
* @param class_id
* IN: Error class identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Eunregister_class(long class_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5E
+ *
* H5Ewalk walks the error stack specified by estack_id for the current thread and calls the
* function specified in func for each error along the way.
*
@@ -4236,7 +4592,7 @@ public class H5 implements java.io.Serializable {
* IN: Data to be passed with func.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* func is null.
**/
@@ -4246,6 +4602,8 @@ public class H5 implements java.io.Serializable {
H5Ewalk2(stack_id, direction, func, client_data);
}
/**
+ * @ingroup JH5E
+ *
* H5Ewalk2 walks the error stack specified by estack_id for the current thread and calls the
* function specified in func for each error along the way.
*
@@ -4259,7 +4617,7 @@ public class H5 implements java.io.Serializable {
* IN: Data to be passed with func.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* func is null.
**/
@@ -4295,11 +4653,51 @@ public class H5 implements java.io.Serializable {
// ////////////////////////////////////////////////////////////
// //
+ // H5ES: Event Set Interface Functions //
+ // //
+ // ////////////////////////////////////////////////////////////
+ /**
+ *
+ * @defgroup JH5ES Java Event Set (H5ES) Interface
+ *
+ * @see H5ES, C-API
+ *
+ * @see @ref H5ES_UG, User Guide
+ */
+
+ // /////// unimplemented ////////
+ // H5_DLL hid_t H5EScreate(void);
+ // H5_DLL herr_t H5ESwait(hid_t es_id, uint64_t timeout, size_t *num_in_progress, hbool_t *err_occurred);
+ // H5_DLL herr_t H5EScancel(hid_t es_id, size_t *num_not_canceled, hbool_t *err_occurred);
+ // H5_DLL herr_t H5ESget_count(hid_t es_id, size_t *count);
+ // H5_DLL herr_t H5ESget_op_counter(hid_t es_id, uint64_t *counter);
+ // H5_DLL herr_t H5ESget_err_status(hid_t es_id, hbool_t *err_occurred);
+ // H5_DLL herr_t H5ESget_err_count(hid_t es_id, size_t *num_errs);
+ // H5_DLL herr_t H5ESget_err_info(hid_t es_id, size_t num_err_info, H5ES_err_info_t err_info[],
+ // size_t *err_cleared);
+ // H5_DLL herr_t H5ESfree_err_info(size_t num_err_info, H5ES_err_info_t err_info[]);
+ // H5_DLL herr_t H5ESregister_insert_func(hid_t es_id, H5ES_event_insert_func_t func, void *ctx);
+ // H5_DLL herr_t H5ESregister_complete_func(hid_t es_id, H5ES_event_complete_func_t func, void *ctx);
+ // H5_DLL herr_t H5ESclose(hid_t es_id);
+ //
+
+ // ////////////////////////////////////////////////////////////
+ // //
// H5F: File Interface Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ *
+ * @defgroup JH5F Java File (H5F) Interface
+ *
+ * @see H5F, C-API
+ *
+ * @see @ref H5F_UG, User Guide
+ */
/**
+ * @ingroup JH5F
+ *
* H5Fclose terminates access to an HDF5 file.
*
* @param file_id
@@ -4308,7 +4706,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Fclose(long file_id) throws HDF5LibraryException
{
@@ -4324,6 +4722,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Fclose(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fopen opens an existing file and is the primary function for accessing existing HDF5 files.
*
* @param name
@@ -4336,7 +4736,7 @@ public class H5 implements java.io.Serializable {
* @return a file identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -4356,6 +4756,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* H5Freopen reopens an HDF5 file.
*
* @param file_id
@@ -4364,7 +4766,7 @@ public class H5 implements java.io.Serializable {
* @return a new file identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Freopen(long file_id) throws HDF5LibraryException
{
@@ -4380,25 +4782,27 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Freopen(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fcreate is the primary function for creating HDF5 files.
*
* @param name
* Name of the file to access.
* @param flags
* File access flags. Possible values include:
- * <UL>
- * <LI>
- * H5F_ACC_RDWR Allow read and write access to file.</LI>
- * <LI>
- * H5F_ACC_RDONLY Allow read-only access to file.</LI>
- * <LI>
- * H5F_ACC_TRUNC Truncate file, if it already exists, erasing all data previously stored in the
- * file.</LI>
- * <LI>
- * H5F_ACC_EXCL Fail if file already exists.</LI>
- * <LI>
- * H5P_DEFAULT Apply default file access and creation properties.</LI>
- * </UL>
+ * <ul>
+ * <li>
+ * @ref H5F_ACC_RDWR Allow read and write access to file.</li>
+ * <li>
+ * @ref H5F_ACC_RDONLY Allow read-only access to file.</li>
+ * <li>
+ * @ref H5F_ACC_TRUNC Truncate file, if it already exists, erasing all data previously stored
+ * in the file.</li>
+ * <li>
+ * @ref H5F_ACC_EXCL Fail if file already exists.</li>
+ * <li>
+ * @ref H5P_DEFAULT Apply default file access and creation properties.</li>
+ * </ul>
*
* @param create_id
* File creation property list identifier, used when modifying default file meta-data. Use
@@ -4411,7 +4815,7 @@ public class H5 implements java.io.Serializable {
* @return a file identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -4431,8 +4835,10 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* H5Fflush causes all buffers associated with a file or object to be immediately flushed (written) to
- * disk without removing the data from the (memory) cache. <P> After this call completes, the file (or
+ * disk without removing the data from the (memory) cache. <p> After this call completes, the file (or
* object) is in a consistent state and all data written to date is assured to be permanent.
*
* @param object_id
@@ -4440,9 +4846,9 @@ public class H5 implements java.io.Serializable {
* associated with the file, including the file itself, a dataset, a group, an attribute,
* or a named data type.
* @param scope
- * specifies the scope of the flushing action, in the case that the HDF-5 file is not a single
+ * specifies the scope of the flushing action, in the case that the HDF5 file is not a single
* physical file.
- * <P> Valid values are:
+ * <p> Valid values are:
* <UL>
* <LI> H5F_SCOPE_GLOBAL Flushes the entire virtual file.</LI>
* <LI> H5F_SCOPE_LOCAL Flushes only the specified file.</LI>
@@ -4451,11 +4857,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Fflush(long object_id, int scope) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_access_plist returns the file access property list identifier of the specified file.
*
* @param file_id
@@ -4464,7 +4872,7 @@ public class H5 implements java.io.Serializable {
* @return a file access property list identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Fget_access_plist(long file_id) throws HDF5LibraryException
{
@@ -4480,6 +4888,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Fget_access_plist(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_create_plist returns a file creation property list identifier identifying the creation
* properties used to create this file.
*
@@ -4489,7 +4899,7 @@ public class H5 implements java.io.Serializable {
* @return a file creation property list identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Fget_create_plist(long file_id) throws HDF5LibraryException
{
@@ -4505,6 +4915,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Fget_create_plist(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_filesize retrieves the file size of the HDF5 file. This function
* is called after an existing file is opened in order
* to learn the true size of the underlying file.
@@ -4515,11 +4927,13 @@ public class H5 implements java.io.Serializable {
* @return the file size of the HDF5 file
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Fget_filesize(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_freespace returns the amount of space that is unused by any objects in the file.
*
* @param file_id
@@ -4528,11 +4942,13 @@ public class H5 implements java.io.Serializable {
* @return the amount of free space in the file
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Fget_freespace(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_intent retrieves the intended access mode flag passed with H5Fopen when the file was opened.
*
* @param file_id
@@ -4541,11 +4957,13 @@ public class H5 implements java.io.Serializable {
* @return the intended access mode flag, as originally passed with H5Fopen.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Fget_intent(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_fileno retrieves the "file number" for an open file.
*
* @param file_id
@@ -4554,11 +4972,13 @@ public class H5 implements java.io.Serializable {
* @return the unique file number for the file.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Fget_fileno(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_mdc_hit_rate queries the metadata cache of the target file to obtain its hit rate (cache hits /
* (cache hits + cache misses)) since the last time hit rate statistics were reset.
*
@@ -4568,11 +4988,13 @@ public class H5 implements java.io.Serializable {
* @return the double in which the hit rate is returned.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native double H5Fget_mdc_hit_rate(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_mdc_size queries the metadata cache of the target file for the desired size information.
*
* @param file_id
@@ -4588,7 +5010,7 @@ public class H5 implements java.io.Serializable {
* @return current number of entries in the cache
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* metadata_cache is null.
**/
@@ -4596,6 +5018,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_name retrieves the name of the file to which the object obj_id belongs.
*
* @param obj_id
@@ -4604,11 +5028,13 @@ public class H5 implements java.io.Serializable {
* @return the filename.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Fget_name(long obj_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_obj_count returns the number of open object identifiers for the file.
*
* @param file_id
@@ -4628,12 +5054,14 @@ public class H5 implements java.io.Serializable {
* @return the number of open objects.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Fget_obj_count(long file_id, int types)
throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_obj_ids returns the list of identifiers for all open HDF5 objects fitting the specified
* criteria.
*
@@ -4649,7 +5077,7 @@ public class H5 implements java.io.Serializable {
* @return the number of objects placed into obj_id_list.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* obj_id_list is null.
**/
@@ -4658,15 +5086,17 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* H5Fis_hdf5 determines whether a file is in the HDF5 format.
*
* @param name
* File name to check format.
*
- * @return true if is HDF-5, false if not.
+ * @return true if is HDF5, false if not.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*
@@ -4677,6 +5107,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* H5Fis_accessible determines if the file can be opened with the given fapl.
*
* @param name
@@ -4687,7 +5119,7 @@ public class H5 implements java.io.Serializable {
* @return true if file is accessible, false if not.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -4695,6 +5127,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* H5Fmount mounts the file specified by child_id onto the group specified by loc_id and name using the
* mount properties plist_id.
*
@@ -4710,7 +5144,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -4718,6 +5152,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* Given a mount point, H5Funmount disassociates the mount point's file from the file mounted there.
*
* @param loc_id
@@ -4728,7 +5164,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -4736,6 +5172,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* H5Freset_mdc_hit_rate_stats resets the hit rate statistics counters in the metadata cache associated
* with the specified file.
*
@@ -4743,12 +5181,14 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the target file.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Freset_mdc_hit_rate_stats(long file_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_info returns global information for the file associated with the
* object identifier obj_id.
*
@@ -4757,11 +5197,13 @@ public class H5 implements java.io.Serializable {
* @return A buffer(H5F_info2_t) for current "global" information about file
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native H5F_info2_t H5Fget_info(long obj_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fclear_elink_file_cache evicts all the cached child files in the specified file's external file
* cache, causing them to be closed if there is nothing else holding them open.
*
@@ -4769,12 +5211,14 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the target file.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Fclear_elink_file_cache(long file_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fstart_swmr_write will activate SWMR writing mode for a file associated with file_id. This routine
* will prepare and ensure the file is safe for SWMR writing.
*
@@ -4782,22 +5226,26 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the target file.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Fstart_swmr_write(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fstart_mdc_logging starts logging metadata cache events if logging was previously enabled.
*
* @param file_id
* IN: Identifier of the target file.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Fstart_mdc_logging(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fstop_mdc_logging stops logging metadata cache events if logging was previously enabled and is
* currently ongoing.
*
@@ -4805,11 +5253,13 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the target file.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Fstop_mdc_logging(long file_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_mdc_logging_status gets the current metadata cache logging status.
*
* @param file_id
@@ -4821,7 +5271,7 @@ public class H5 implements java.io.Serializable {
* mdc_logging_status[1] = is_currently_logging, whether events are currently being logged
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* mdc_logging_status is null.
**/
@@ -4830,6 +5280,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5F
+ *
* H5Fget_dset_no_attrs_hint gets the file-level setting to create minimized dataset object headers.
*
* @param file_id
@@ -4838,12 +5290,14 @@ public class H5 implements java.io.Serializable {
* @return true if the file-level is set to create minimized dataset object headers, false if not.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Fget_dset_no_attrs_hint(long file_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fset_dset_no_attrs_hint sets the file-level setting to create minimized dataset object headers.
*
* @param file_id
@@ -4852,12 +5306,14 @@ public class H5 implements java.io.Serializable {
* the minimize hint setting
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Fset_dset_no_attrs_hint(long file_id, boolean minimize)
throws HDF5LibraryException;
/**
+ * @ingroup JH5F
+ *
* H5Fset_libver_bounds sets a different low and high bounds while a file is open.
*
* @param file_id
@@ -4868,7 +5324,7 @@ public class H5 implements java.io.Serializable {
* IN: The latest version of the library that will be used for writing objects.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Fset_libver_bounds(long file_id, int low, int high)
throws HDF5LibraryException;
@@ -4901,7 +5357,7 @@ public class H5 implements java.io.Serializable {
// * @return a pointer to the file handle being used by the low-level
// virtual file driver.
// *
- // * @exception HDF5LibraryException - Error from the HDF-5 Library.
+ // * @exception HDF5LibraryException - Error from the HDF5 Library.
// **/
// public synchronized static native Pointer file_handle
// H5Fget_vfd_handle(int file_id, int fapl)
@@ -4918,7 +5374,7 @@ public class H5 implements java.io.Serializable {
// *
// * @return none
// *
- // * @exception HDF5LibraryException - Error from the HDF-5 Library.
+ // * @exception HDF5LibraryException - Error from the HDF5 Library.
// * @exception NullPointerException - config_ptr is null.
// **/
// public synchronized static native void H5Fget_mdc_config(int file_id, H5AC_cache_config_t config_ptr)
@@ -4934,7 +5390,7 @@ public class H5 implements java.io.Serializable {
// *
// * @return none
// *
- // * @exception HDF5LibraryException - Error from the HDF-5 Library.
+ // * @exception HDF5LibraryException - Error from the HDF5 Library.
// * @exception NullPointerException - config_ptr is null.
// **/
// public synchronized static native int H5Fset_mdc_config(int file_id, H5AC_cache_config_t config_ptr)
@@ -4979,8 +5435,17 @@ public class H5 implements java.io.Serializable {
// H5G: Group Interface Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5G Java Group (H5G) Interface
+ *
+ * @see H5G, C-API
+ *
+ * @see @ref H5G_UG, User Guide
+ **/
/**
+ * @ingroup JH5G
+ *
* H5Gclose releases resources used by a group which was opened by a call to H5Gcreate() or H5Gopen().
*
* @param group_id
@@ -4989,7 +5454,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Gclose(long group_id) throws HDF5LibraryException
{
@@ -5005,6 +5470,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Gclose(long group_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5G
+ *
* H5Gcreate creates a new group with the specified name at the specified location, loc_id.
*
* @param loc_id
@@ -5022,7 +5489,7 @@ public class H5 implements java.io.Serializable {
* @return a valid group identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5043,6 +5510,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5G
+ *
* H5Gcreate_anon creates a new empty group in the file specified by loc_id.
*
* @param loc_id
@@ -5056,7 +5525,7 @@ public class H5 implements java.io.Serializable {
* @return a valid group identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Gcreate_anon(long loc_id, long gcpl_id, long gapl_id) throws HDF5LibraryException
{
@@ -5073,6 +5542,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5G
+ *
* H5Gget_create_plist returns an identifier for the group creation property list associated with the
* group specified by group_id.
*
@@ -5082,11 +5553,13 @@ public class H5 implements java.io.Serializable {
* @return an identifier for the group's creation property list
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Gget_create_plist(long group_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5G
+ *
* H5Gget_info retrieves information about the group specified by group_id. The information is returned in
* the group_info struct.
*
@@ -5096,11 +5569,13 @@ public class H5 implements java.io.Serializable {
* @return a structure in which group information is returned
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native H5G_info_t H5Gget_info(long group_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5G
+ *
* H5Gget_info_by_idx retrieves information about a group, according to the group's position within an
* index.
*
@@ -5120,7 +5595,7 @@ public class H5 implements java.io.Serializable {
* @return a structure in which group information is returned
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5130,6 +5605,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5G
+ *
* H5Gget_info_by_name retrieves information about the group group_name located in the file or group
* specified by loc_id.
*
@@ -5143,7 +5620,7 @@ public class H5 implements java.io.Serializable {
* @return a structure in which group information is returned
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5151,6 +5628,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5G
+ *
* retrieves information of all objects under the group (name) located in the file or group specified by
* loc_id.
*
@@ -5168,7 +5647,7 @@ public class H5 implements java.io.Serializable {
* @return the number of items found
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*/
@@ -5185,6 +5664,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5G
+ *
* retrieves information of all objects under the group (name) located in the file or group specified by
* loc_id.
*
@@ -5206,7 +5687,7 @@ public class H5 implements java.io.Serializable {
* @return the number of items found
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*/
@@ -5219,6 +5700,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5G
+ *
* retrieves information of all objects under the group (name) located in the file or group specified by
* loc_id.
*
@@ -5242,7 +5725,7 @@ public class H5 implements java.io.Serializable {
* @return the number of items found
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*/
@@ -5255,6 +5738,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5G
+ *
* retrieves information of all objects under the group (name) located in the file or group specified by
* loc_id.
*
@@ -5280,7 +5765,7 @@ public class H5 implements java.io.Serializable {
* @return the number of items found
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*/
@@ -5331,6 +5816,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5G
+ *
* H5Gget_obj_info_idx report the name and type of object with index 'idx' in a Group. The 'idx'
* corresponds to the index maintained by H5Giterate. Each link is returned, so objects with multiple
* links will be counted once for each link.
@@ -5349,7 +5836,7 @@ public class H5 implements java.io.Serializable {
* @return non-negative if successful, -1 if not.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*/
@@ -5373,6 +5860,8 @@ public class H5 implements java.io.Serializable {
* a lot of time to finish if the number of objects is more than 10,000
*/
/**
+ * @ingroup JH5G
+ *
* retrieves information of all objects (recurvisely) under the group (name) located in the file or group
* specified by loc_id up to maximum specified by objMax.
*
@@ -5392,7 +5881,7 @@ public class H5 implements java.io.Serializable {
* @return the number of items found
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*/
@@ -5433,6 +5922,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5G
+ *
* H5Gn_members report the number of objects in a Group. The 'objects' include everything that will be
* visited by H5Giterate. Each link is returned, so objects with multiple links will be counted once for
* each link.
@@ -5445,7 +5936,7 @@ public class H5 implements java.io.Serializable {
* @return the number of members in the group or -1 if error.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*/
@@ -5467,6 +5958,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5G
+ *
* H5Gopen opens an existing group, name, at the location specified by loc_id.
*
* @param loc_id
@@ -5479,7 +5972,7 @@ public class H5 implements java.io.Serializable {
* @return a valid group identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5499,6 +5992,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5G
+ *
* H5Gflush causes all buffers associated with a group to be immediately flushed to disk without
* removing the data from the cache.
*
@@ -5506,11 +6001,13 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the group to be flushed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Gflush(long group_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5G
+ *
* H5Grefresh causes all buffers associated with a group to be cleared and immediately re-loaded
* with updated contents from disk. This function essentially closes the group, evicts all metadata
* associated with it from the cache, and then re-opens the group. The reopened group is automatically
@@ -5520,7 +6017,7 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the group to be refreshed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Grefresh(long group_id) throws HDF5LibraryException;
@@ -5553,8 +6050,17 @@ public class H5 implements java.io.Serializable {
// H5I: HDF5 Identifier Interface API Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5I Java Identifier (H5I) Interface
+ *
+ * @see H5I, C-API
+ *
+ * @see @ref H5I_UG, User Guide
+ **/
/**
+ * @ingroup JH5I
+ *
* H5Iget_file_id obtains the file ID specified by the identifier, obj_id.
*
* @param obj_id
@@ -5563,11 +6069,13 @@ public class H5 implements java.io.Serializable {
* @return the file ID.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Iget_file_id(long obj_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Iget_name_long retrieves the name of an object specified by the identifier, obj_id.
* @deprecated
*
@@ -5581,12 +6089,14 @@ public class H5 implements java.io.Serializable {
* @return the length of the name retrieved.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
@Deprecated
public synchronized static native long H5Iget_name_long(long obj_id, String[] name, long size)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5I
+ *
* H5Iget_name retrieves the name of an object specified by the identifier, obj_id.
*
* @param obj_id
@@ -5595,11 +6105,13 @@ public class H5 implements java.io.Serializable {
* @return String for Attribute name.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Iget_name(long obj_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Iget_ref obtains the number of references outstanding specified by the identifier, obj_id.
*
* @param obj_id
@@ -5608,12 +6120,14 @@ public class H5 implements java.io.Serializable {
* @return the reference count.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Iget_ref(long obj_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5I
+ *
* H5Idec_ref decrements the reference count specified by the identifier, obj_id.
* If the reference count for an ID reaches zero, the object will be closed.
*
@@ -5623,12 +6137,14 @@ public class H5 implements java.io.Serializable {
* @return the reference count.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Idec_ref(long obj_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5I
+ *
* H5Iinc_ref increments the reference count specified by the identifier, obj_id.
*
* @param obj_id
@@ -5637,12 +6153,14 @@ public class H5 implements java.io.Serializable {
* @return the reference count.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Iinc_ref(long obj_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5I
+ *
* H5Iget_type retrieves the type of the object identified by obj_id.
*
* @param obj_id
@@ -5651,11 +6169,13 @@ public class H5 implements java.io.Serializable {
* @return the object type if successful; otherwise H5I_BADID.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Iget_type(long obj_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Iget_type_ref retrieves the reference count on an ID type. The reference count is used by the library
* to indicate when an ID type can be destroyed.
*
@@ -5665,11 +6185,13 @@ public class H5 implements java.io.Serializable {
* @return The current reference count on success, negative on failure.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Iget_type_ref(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Idec_type_ref decrements the reference count on an identifier type. The reference count is used by
* the library to indicate when an identifier type can be destroyed. If the reference count reaches zero,
* this function will destroy it.
@@ -5680,11 +6202,13 @@ public class H5 implements java.io.Serializable {
* @return The current reference count on success, negative on failure.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Idec_type_ref(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Iinc_type_ref increments the reference count on an ID type. The reference count is used by the
* library to indicate when an ID type can be destroyed.
*
@@ -5694,11 +6218,13 @@ public class H5 implements java.io.Serializable {
* @return The current reference count on success, negative on failure.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Iinc_type_ref(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Inmembers returns the number of identifiers of the identifier type specified in type.
*
* @param type_id
@@ -5707,11 +6233,13 @@ public class H5 implements java.io.Serializable {
* @return Number of identifiers of the specified identifier type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Inmembers(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Iis_valid indicates if the identifier type specified in obj_id is valid.
*
* @param obj_id
@@ -5720,11 +6248,13 @@ public class H5 implements java.io.Serializable {
* @return a boolean, true if the specified identifier id is valid
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Iis_valid(long obj_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Itype_exists indicates if the identifier type specified in type exists.
*
* @param type_id
@@ -5733,11 +6263,13 @@ public class H5 implements java.io.Serializable {
* @return a boolean, true if the specified identifier type exists
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Itype_exists(int type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Iclear_type deletes all identifiers of the type identified by the argument type.
*
* @param type_id
@@ -5746,12 +6278,14 @@ public class H5 implements java.io.Serializable {
* IN: Whether or not to force deletion of all identifiers
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Iclear_type(int type_id, boolean force)
throws HDF5LibraryException;
/**
+ * @ingroup JH5I
+ *
* H5Idestroy_type deletes an entire identifier type. All identifiers of this type are destroyed
* and no new identifiers of this type can be registered.
*
@@ -5759,7 +6293,7 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of identifier type which is to be destroyed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Idestroy_type(int type_id) throws HDF5LibraryException;
@@ -5785,8 +6319,17 @@ public class H5 implements java.io.Serializable {
// //////////////////////////////////////////////////////////////////
// H5L: Link Interface Functions //
// //////////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5L Java Link (H5L) Interface
+ *
+ * @see H5L, C-API
+ *
+ * @see @ref H5L_UG, User Guide
+ **/
/**
+ * @ingroup JH5L
+ *
* H5Lcopy copies a link from one location to another.
*
* @param src_loc
@@ -5803,7 +6346,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5812,6 +6355,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lcreate_external creates a new soft link to an external object, which is an object in a different
* HDF5 file from the location of the link.
*
@@ -5829,7 +6374,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5839,6 +6384,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lcreate_hard creates a new hard link to a pre-existing object in an HDF5 file.
*
* @param cur_loc
@@ -5855,7 +6402,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* cur_name or dst_name is null.
**/
@@ -5864,6 +6411,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lcreate_soft creates a new soft link to an object in an HDF5 file.
*
* @param link_target
@@ -5878,7 +6427,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* link_name is null.
**/
@@ -5887,6 +6436,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Ldelete removes the link specified from a group.
*
* @param loc_id
@@ -5897,7 +6448,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5905,6 +6456,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Ldelete_by_idx removes the nth link in a group according to the specified order and in the specified
* index.
*
@@ -5922,7 +6475,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* group_name is null.
**/
@@ -5931,6 +6484,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lexists checks if a link with a particular name exists in a group.
*
* @param loc_id
@@ -5943,7 +6498,7 @@ public class H5 implements java.io.Serializable {
* @return a boolean, true if the name exists, otherwise false.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5951,6 +6506,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lget_info returns information about the specified link.
*
* @param loc_id
@@ -5963,7 +6520,7 @@ public class H5 implements java.io.Serializable {
* @return a buffer(H5L_info_t) for the link information.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -5971,6 +6528,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lget_info_by_idx opens a named datatype at the location specified by loc_id and return an identifier
* for the datatype.
*
@@ -5990,7 +6549,7 @@ public class H5 implements java.io.Serializable {
* @return a buffer(H5L_info_t) for the link information.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* group_name is null.
**/
@@ -6000,6 +6559,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lget_name_by_idx retrieves name of the nth link in a group, according to the order within a specified
* field or index.
*
@@ -6019,7 +6580,7 @@ public class H5 implements java.io.Serializable {
* @return a String for the link name.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* group_name is null.
**/
@@ -6028,6 +6589,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lget_value returns the link value of a symbolic link. Note that this function is a combination
* of H5Lget_info(), H5Lget_val() and for external links, H5Lunpack_elink_val.
*
@@ -6043,7 +6606,7 @@ public class H5 implements java.io.Serializable {
* @return the link type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6052,6 +6615,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lget_value_by_idx retrieves value of the nth link in a group, according to the order within an index.
* Note that this function is a combination of H5Lget_info(), H5Lget_val() and for external links,
* H5Lunpack_elink_val.
@@ -6074,7 +6639,7 @@ public class H5 implements java.io.Serializable {
* @return the link type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* group_name is null.
**/
@@ -6084,6 +6649,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Literate iterates through links in a group.
*
* @param grp_id
@@ -6103,13 +6670,15 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Literate(long grp_id, int idx_type, int order, long idx,
H5L_iterate_t op, H5L_iterate_opdata_t op_data)
throws HDF5LibraryException;
/**
+ * @ingroup JH5L
+ *
* H5Literate_by_name iterates through links in a group.
*
* @param grp_id
@@ -6133,7 +6702,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* group_name is null.
**/
@@ -6143,6 +6712,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lmove renames a link within an HDF5 file.
*
* @param src_loc
@@ -6159,7 +6730,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier to be associated with the new link.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6168,6 +6739,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lvisit recursively visits all links starting from a specified group.
*
* @param grp_id
@@ -6185,12 +6758,14 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Lvisit(long grp_id, int idx_type, int order, H5L_iterate_t op,
H5L_iterate_opdata_t op_data) throws HDF5LibraryException;
/**
+ * @ingroup JH5L
+ *
* H5Lvisit_by_name recursively visits all links starting from a specified group.
*
* @param loc_id
@@ -6212,7 +6787,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* group_name is null.
**/
@@ -6222,6 +6797,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5L
+ *
* H5Lis_registered tests whether a user-defined link class is currently registered,
* either by the HDF5 Library or by the user through the use of H5Lregister.
*
@@ -6233,11 +6810,13 @@ public class H5 implements java.io.Serializable {
* user-defined class identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Lis_registered(int link_cls_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5L
+ *
* H5Lunregister unregisters a class of user-defined links, preventing them from being traversed, queried,
* moved, etc.
*
@@ -6245,7 +6824,7 @@ public class H5 implements java.io.Serializable {
* IN: User-defined link class identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Lunregister(int link_cls_id) throws HDF5LibraryException;
@@ -6279,8 +6858,17 @@ public class H5 implements java.io.Serializable {
// H5O: HDF5 1.8 Object Interface API Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5O Java Object (H5O) Interface
+ *
+ * @see H5O, C-API
+ *
+ * @see @ref H5O_UG, User Guide
+ **/
/**
+ * @ingroup JH5O
+ *
* H5Oclose closes the group, dataset, or named datatype specified.
*
* @param object_id
@@ -6289,7 +6877,7 @@ public class H5 implements java.io.Serializable {
* @return non-negative on success
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Oclose(long object_id) throws HDF5LibraryException
{
@@ -6305,6 +6893,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Oclose(long object_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5O
+ *
* H5Ocopy copies the group, dataset or named datatype specified from the file or group specified by
* source location to the destination location.
*
@@ -6322,7 +6912,7 @@ public class H5 implements java.io.Serializable {
* IN: Link creation property list for the new hard link
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6331,6 +6921,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Oget_comment retrieves the comment for the specified object.
*
* @param obj_id
@@ -6339,12 +6931,14 @@ public class H5 implements java.io.Serializable {
* @return the comment
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Oget_comment(long obj_id)
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5O
+ *
* H5Oset_comment sets the comment for the specified object.
*
* @param obj_id
@@ -6353,7 +6947,7 @@ public class H5 implements java.io.Serializable {
* IN: The new comment.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
* @deprecated As of HDF5 1.8 in favor of object attributes.
**/
@@ -6362,6 +6956,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5O
+ *
* H5Oget_comment_by_name retrieves the comment for an object.
*
* @param loc_id
@@ -6374,7 +6970,7 @@ public class H5 implements java.io.Serializable {
* @return the comment
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6382,6 +6978,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Oset_comment_by_name sets the comment for the specified object.
*
* @param loc_id
@@ -6394,7 +6992,7 @@ public class H5 implements java.io.Serializable {
* IN: Link access property list identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
*
@@ -6406,6 +7004,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Oget_info retrieves the metadata for an object specified by an identifier.
*
* @param loc_id
@@ -6414,7 +7014,7 @@ public class H5 implements java.io.Serializable {
* @return object information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6424,6 +7024,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5O
+ *
* H5Oget_info retrieves the metadata for an object specified by an identifier.
*
* @param loc_id
@@ -6434,7 +7036,7 @@ public class H5 implements java.io.Serializable {
* @return object information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6442,56 +7044,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
- * H5Oget_info_by_name retrieves the metadata for an object, identifying the object by location and
- * relative name.
- *
- * @param loc_id
- * IN: File or group identifier specifying location of group in which object is located
- * @param name
- * IN: Relative name of group
- * @param lapl_id
- * IN: Access property list identifier for the link pointing to the object (Not currently used;
- * pass as H5P_DEFAULT.)
- *
- * @return object information
+ * @ingroup JH5O
*
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * name is null.
- **/
- public static H5O_info_t H5Oget_info_by_name(long loc_id, String name, long lapl_id)
- throws HDF5LibraryException, NullPointerException
- {
- return H5Oget_info_by_name(loc_id, name, HDF5Constants.H5O_INFO_ALL, lapl_id);
- }
-
- /**
- * H5Oget_info_by_name retrieves the metadata for an object, identifying the object by location and
- * relative name.
- *
- * @param loc_id
- * IN: File or group identifier specifying location of group in which object is located
- * @param name
- * IN: Relative name of group
- * @param fields
- * IN: Object fields to select
- * @param lapl_id
- * IN: Access property list identifier for the link pointing to the object (Not currently used;
- * pass as H5P_DEFAULT.)
- *
- * @return object information
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * name is null.
- **/
- public synchronized static native H5O_info_t H5Oget_info_by_name(long loc_id, String name, int fields,
- long lapl_id)
- throws HDF5LibraryException, NullPointerException;
-
- /**
* H5Oget_info_by_idx retrieves the metadata for an object, identifying the object by an index position.
*
* @param loc_id
@@ -6511,7 +7065,7 @@ public class H5 implements java.io.Serializable {
* @return object information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6524,6 +7078,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5O
+ *
* H5Oget_info_by_idx retrieves the metadata for an object, identifying the object by an index position.
*
* @param loc_id
@@ -6545,7 +7101,7 @@ public class H5 implements java.io.Serializable {
* @return object information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6555,50 +7111,10 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
- * H5Oget_native_info retrieves the native HDF5-specific metadata for an HDF5 object specified by an
- * identifier. Native HDF5-specific metadata includes things like object header information and object
- * storage layout information.
- *
- * @param loc_id
- * IN: Identifier for target object
- *
- * @return object information
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * name is null.
- **/
- public static H5O_native_info_t H5Oget_native_info(long loc_id)
- throws HDF5LibraryException, NullPointerException
- {
- return H5Oget_native_info(loc_id, HDF5Constants.H5O_NATIVE_INFO_ALL);
- }
-
- /**
- * H5Oget_native_info retrieves the native HDF5-specific metadata for an HDF5 object specified by an
- * identifier. Native HDF5-specific metadata includes things like object header information and object
- * storage layout information.
- *
- * @param loc_id
- * IN: Identifier for target object
- * @param fields
- * IN: Object fields to select
- *
- * @return object information
+ * @ingroup JH5O
*
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * name is null.
- **/
- public synchronized static native H5O_native_info_t H5Oget_native_info(long loc_id, int fields)
- throws HDF5LibraryException, NullPointerException;
-
- /**
- * H5Oget_native_info_by_name retrieves the native HDF5-specific metadata for an HDF5 object, identifying
- * the object by location and relative name. Native HDF5-specific metadata includes things like object
- * header information and object storage layout information.
+ * H5Oget_info_by_name retrieves the metadata for an object, identifying the object by location and
+ * relative name.
*
* @param loc_id
* IN: File or group identifier specifying location of group in which object is located
@@ -6611,20 +7127,21 @@ public class H5 implements java.io.Serializable {
* @return object information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
- public static H5O_native_info_t H5Oget_native_info_by_name(long loc_id, String name, long lapl_id)
+ public static H5O_info_t H5Oget_info_by_name(long loc_id, String name, long lapl_id)
throws HDF5LibraryException, NullPointerException
{
- return H5Oget_native_info_by_name(loc_id, name, HDF5Constants.H5O_NATIVE_INFO_ALL, lapl_id);
+ return H5Oget_info_by_name(loc_id, name, HDF5Constants.H5O_INFO_ALL, lapl_id);
}
/**
- * H5Oget_native_info_by_name retrieves the native HDF5-specific metadata for an HDF5 object, identifying
- * the object by location and relative name. Native HDF5-specific metadata includes things like object
- * header information and object storage layout information.
+ * @ingroup JH5O
+ *
+ * H5Oget_info_by_name retrieves the metadata for an object, identifying the object by location and
+ * relative name.
*
* @param loc_id
* IN: File or group identifier specifying location of group in which object is located
@@ -6639,81 +7156,17 @@ public class H5 implements java.io.Serializable {
* @return object information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
- public synchronized static native H5O_native_info_t H5Oget_native_info_by_name(long loc_id, String name,
- int fields, long lapl_id)
+ public synchronized static native H5O_info_t H5Oget_info_by_name(long loc_id, String name, int fields,
+ long lapl_id)
throws HDF5LibraryException, NullPointerException;
/**
- * H5Oget_native_info_by_idx retrieves the native HDF5-specific metadata for an HDF5 object, identifying
- * the object by an index position. Native HDF5-specific metadata includes things like object header
- * information and object storage layout information.
- *
- * @param loc_id
- * IN: File or group identifier
- * @param group_name
- * IN: Name of group, relative to loc_id, in which object is located
- * @param idx_type
- * IN: Type of index by which objects are ordered
- * @param order
- * IN: Order of iteration within index
- * @param n
- * IN: Object to open
- * @param lapl_id
- * IN: Access property list identifier for the link pointing to the object (Not currently used;
- * pass as H5P_DEFAULT.)
- *
- * @return object information
+ * @ingroup JH5O
*
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * name is null.
- **/
- public static H5O_native_info_t H5Oget_native_info_by_idx(long loc_id, String group_name, int idx_type,
- int order, long n, long lapl_id)
- throws HDF5LibraryException, NullPointerException
- {
- return H5Oget_native_info_by_idx(loc_id, group_name, idx_type, order, n,
- HDF5Constants.H5O_NATIVE_INFO_ALL, lapl_id);
- }
-
- /**
- * H5Oget_native_info_by_idx retrieves the native HDF5-specific metadata for an HDF5 object, identifying
- * the object by an index position. Native HDF5-specific metadata includes things like object header
- * information and object storage layout information.
- *
- * @param loc_id
- * IN: File or group identifier
- * @param group_name
- * IN: Name of group, relative to loc_id, in which object is located
- * @param idx_type
- * IN: Type of index by which objects are ordered
- * @param order
- * IN: Order of iteration within index
- * @param n
- * IN: Object to open
- * @param fields
- * IN: Object fields to select
- * @param lapl_id
- * IN: Access property list identifier for the link pointing to the object (Not currently used;
- * pass as H5P_DEFAULT.)
- *
- * @return object information
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * name is null.
- **/
- public synchronized static native H5O_native_info_t H5Oget_native_info_by_idx(
- long loc_id, String group_name, int idx_type, int order, long n, int fields, long lapl_id)
- throws HDF5LibraryException, NullPointerException;
-
- /**
* H5Olink creates a new hard link to an object in an HDF5 file.
*
* @param obj_id
@@ -6728,7 +7181,7 @@ public class H5 implements java.io.Serializable {
* IN: Access property list identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6737,6 +7190,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Oopen opens a group, dataset, or named datatype specified by a location and a path name.
*
* @param loc_id
@@ -6749,7 +7204,7 @@ public class H5 implements java.io.Serializable {
* @return an object identifier for the opened object
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6769,6 +7224,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Ovisit recursively visits all objects accessible from a specified object.
*
* @param obj_id
@@ -6787,7 +7244,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6798,6 +7255,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5O
+ *
* H5Ovisit recursively visits all objects accessible from a specified object.
*
* @param obj_id
@@ -6818,7 +7277,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6827,6 +7286,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Ovisit_by_name recursively visits all objects starting from a specified object.
*
* @param loc_id
@@ -6849,7 +7310,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6862,6 +7323,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5O
+ *
* H5Ovisit_by_name recursively visits all objects starting from a specified object.
*
* @param loc_id
@@ -6886,7 +7349,7 @@ public class H5 implements java.io.Serializable {
* members were processed with no operator returning non-zero.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6896,6 +7359,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Oexists_by_name is used by an application to check that an existing link resolves to an object.
* Primarily, it is designed to check for dangling soft, external, or user-defined links.
*
@@ -6909,7 +7374,7 @@ public class H5 implements java.io.Serializable {
* @return Returns TRUE or FALSE if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -6917,28 +7382,34 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Odecr_refcount decrements the hard link reference count for an object.
*
* @param object_id
* IN: Object identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Odecr_refcount(long object_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5O
+ *
* H5Oincr_refcount increments the hard link reference count for an object.
*
* @param object_id
* IN: Object identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Oincr_refcount(long object_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5O
+ *
* H5Oopen_by_token opens a group, dataset, or named datatype using its object token within an HDF5 file.
*
* @param loc_id
@@ -6949,7 +7420,7 @@ public class H5 implements java.io.Serializable {
* @return an object identifier for the opened object
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Oopen_by_token(long loc_id, H5O_token_t token) throws HDF5LibraryException
{
@@ -6968,6 +7439,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Oopen_by_idx opens the nth object in the group specified.
*
* @param loc_id
@@ -6986,7 +7459,7 @@ public class H5 implements java.io.Serializable {
* @return an object identifier for the opened object
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* group_name is null.
**/
@@ -7007,6 +7480,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5O
+ *
* H5Oflush causes all buffers associated with an object to be immediately flushed to disk without
* removing the data from the cache. object_id can be any named object associated with an HDF5 file
* including a dataset, a group, or a committed datatype.
@@ -7015,11 +7490,13 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the object to be flushed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Oflush(long object_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5O
+ *
* H5Orefresh causes all buffers associated with an object to be cleared and immediately re-loaded with
* updated contents from disk. This function essentially closes the object, evicts all metadata associated
* with it from the cache, and then re-opens the object. The reopened object is automatically
@@ -7030,11 +7507,13 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the object to be refreshed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Orefresh(long object_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5O
+ *
* H5Odisable_mdc_flushes corks an object, keeping dirty entries associated with the object in the
* metadata cache.
*
@@ -7042,7 +7521,10 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the object to be corked.
**/
public synchronized static native void H5Odisable_mdc_flushes(long object_id);
+
/**
+ * @ingroup JH5O
+ *
* H5Oenable_mdc_flushes uncorks an object, keeping dirty entries associated with the object in the
* metadata cache.
*
@@ -7050,7 +7532,10 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the object to be uncorked.
**/
public synchronized static native void H5Oenable_mdc_flushes(long object_id);
+
/**
+ * @ingroup JH5O
+ *
* H5Oare_mdc_flushes_disabled retrieve the object's "cork" status.
*
* @param object_id
@@ -7062,6 +7547,177 @@ public class H5 implements java.io.Serializable {
**/
public synchronized static native boolean H5Oare_mdc_flushes_disabled(long object_id);
+ /**
+ * @ingroup JH5O
+ *
+ * H5Oget_native_info retrieves the native HDF5-specific metadata for an HDF5 object specified by an
+ * identifier. Native HDF5-specific metadata includes things like object header information and object
+ * storage layout information.
+ *
+ * @param loc_id
+ * IN: Identifier for target object
+ *
+ * @return object information
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * name is null.
+ **/
+ public static H5O_native_info_t H5Oget_native_info(long loc_id)
+ throws HDF5LibraryException, NullPointerException
+ {
+ return H5Oget_native_info(loc_id, HDF5Constants.H5O_NATIVE_INFO_ALL);
+ }
+
+ /**
+ * @ingroup JH5O
+ *
+ * H5Oget_native_info retrieves the native HDF5-specific metadata for an HDF5 object specified by an
+ * identifier. Native HDF5-specific metadata includes things like object header information and object
+ * storage layout information.
+ *
+ * @param loc_id
+ * IN: Identifier for target object
+ * @param fields
+ * IN: Object fields to select
+ *
+ * @return object information
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * name is null.
+ **/
+ public synchronized static native H5O_native_info_t H5Oget_native_info(long loc_id, int fields)
+ throws HDF5LibraryException, NullPointerException;
+
+ /**
+ * @ingroup JH5O
+ *
+ * H5Oget_native_info_by_idx retrieves the native HDF5-specific metadata for an HDF5 object, identifying
+ * the object by an index position. Native HDF5-specific metadata includes things like object header
+ * information and object storage layout information.
+ *
+ * @param loc_id
+ * IN: File or group identifier
+ * @param group_name
+ * IN: Name of group, relative to loc_id, in which object is located
+ * @param idx_type
+ * IN: Type of index by which objects are ordered
+ * @param order
+ * IN: Order of iteration within index
+ * @param n
+ * IN: Object to open
+ * @param lapl_id
+ * IN: Access property list identifier for the link pointing to the object (Not currently used;
+ * pass as H5P_DEFAULT.)
+ *
+ * @return object information
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * name is null.
+ **/
+ public static H5O_native_info_t H5Oget_native_info_by_idx(long loc_id, String group_name, int idx_type,
+ int order, long n, long lapl_id)
+ throws HDF5LibraryException, NullPointerException
+ {
+ return H5Oget_native_info_by_idx(loc_id, group_name, idx_type, order, n,
+ HDF5Constants.H5O_NATIVE_INFO_ALL, lapl_id);
+ }
+
+ /**
+ * @ingroup JH5O
+ *
+ * H5Oget_native_info_by_idx retrieves the native HDF5-specific metadata for an HDF5 object, identifying
+ * the object by an index position. Native HDF5-specific metadata includes things like object header
+ * information and object storage layout information.
+ *
+ * @param loc_id
+ * IN: File or group identifier
+ * @param group_name
+ * IN: Name of group, relative to loc_id, in which object is located
+ * @param idx_type
+ * IN: Type of index by which objects are ordered
+ * @param order
+ * IN: Order of iteration within index
+ * @param n
+ * IN: Object to open
+ * @param fields
+ * IN: Object fields to select
+ * @param lapl_id
+ * IN: Access property list identifier for the link pointing to the object (Not currently used;
+ * pass as H5P_DEFAULT.)
+ *
+ * @return object information
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * name is null.
+ **/
+ public synchronized static native H5O_native_info_t H5Oget_native_info_by_idx(
+ long loc_id, String group_name, int idx_type, int order, long n, int fields, long lapl_id)
+ throws HDF5LibraryException, NullPointerException;
+
+ /**
+ * @ingroup JH5O
+ *
+ * H5Oget_native_info_by_name retrieves the native HDF5-specific metadata for an HDF5 object, identifying
+ * the object by location and relative name. Native HDF5-specific metadata includes things like object
+ * header information and object storage layout information.
+ *
+ * @param loc_id
+ * IN: File or group identifier specifying location of group in which object is located
+ * @param name
+ * IN: Relative name of group
+ * @param lapl_id
+ * IN: Access property list identifier for the link pointing to the object (Not currently used;
+ * pass as H5P_DEFAULT.)
+ *
+ * @return object information
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * name is null.
+ **/
+ public static H5O_native_info_t H5Oget_native_info_by_name(long loc_id, String name, long lapl_id)
+ throws HDF5LibraryException, NullPointerException
+ {
+ return H5Oget_native_info_by_name(loc_id, name, HDF5Constants.H5O_NATIVE_INFO_ALL, lapl_id);
+ }
+
+ /**
+ * @ingroup JH5O
+ *
+ * H5Oget_native_info_by_name retrieves the native HDF5-specific metadata for an HDF5 object, identifying
+ * the object by location and relative name. Native HDF5-specific metadata includes things like object
+ * header information and object storage layout information.
+ *
+ * @param loc_id
+ * IN: File or group identifier specifying location of group in which object is located
+ * @param name
+ * IN: Relative name of group
+ * @param fields
+ * IN: Object fields to select
+ * @param lapl_id
+ * IN: Access property list identifier for the link pointing to the object (Not currently used;
+ * pass as H5P_DEFAULT.)
+ *
+ * @return object information
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * name is null.
+ **/
+ public synchronized static native H5O_native_info_t H5Oget_native_info_by_name(long loc_id, String name,
+ int fields, long lapl_id)
+ throws HDF5LibraryException, NullPointerException;
+
// /////// unimplemented ////////
// herr_t H5Otoken_cmp(hid_t loc_id, const H5O_token_t *token1, const H5O_token_t *token2,
// int *cmp_value);
@@ -7075,8 +7731,17 @@ public class H5 implements java.io.Serializable {
// ////////////////////////////////////////////////////////////
// /////// Generic property list routines ///////
+ /**
+ * @defgroup JH5P Java Property List (H5P) Interface
+ *
+ * @see H5P, C-API
+ *
+ * @see @ref H5P_UG, User Guide
+ **/
/**
+ * @ingroup JH5P
+ *
* H5Pget_class_name retrieves the name of a generic property list class
*
* @param plid
@@ -7084,11 +7749,13 @@ public class H5 implements java.io.Serializable {
* @return name of a property list if successful; null if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native String H5Pget_class_name(long plid) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pcreate creates a new property as an instance of some property list class.
*
* @param type
@@ -7097,7 +7764,7 @@ public class H5 implements java.io.Serializable {
* @return a property list identifier (plist) if successful; otherwise Fail (-1).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Pcreate(long type) throws HDF5LibraryException
{
@@ -7113,6 +7780,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Pcreate(long type) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget retrieves a copy of the value for a property in a property list (support integer only)
*
* @param plid
@@ -7122,11 +7791,13 @@ public class H5 implements java.io.Serializable {
* @return value for a property if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Pget(long plid, String name) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* Sets a property list value (support integer only)
*
* @param plid
@@ -7138,12 +7809,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Pset(long plid, String name, int value)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pexist determines whether a property exists within a property list or class
*
* @param plid
@@ -7154,11 +7827,13 @@ public class H5 implements java.io.Serializable {
* exist;
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native boolean H5Pexist(long plid, String name) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_size retrieves the size of a property's value in bytes
*
* @param plid
@@ -7168,11 +7843,13 @@ public class H5 implements java.io.Serializable {
* @return size of a property's value if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native long H5Pget_size(long plid, String name) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_nprops retrieves the number of properties in a property list or class
*
* @param plid
@@ -7180,11 +7857,13 @@ public class H5 implements java.io.Serializable {
* @return number of properties if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native long H5Pget_nprops(long plid) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_class returns the property list class for the property list identified by the plist parameter.
*
* @param plist
@@ -7192,11 +7871,13 @@ public class H5 implements java.io.Serializable {
* @return a property list class if successful. Otherwise returns H5P_ROOT (-1).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Pget_class(long plist) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_class_parent retrieves an identifier for the parent class of a property class
*
* @param plid
@@ -7204,11 +7885,13 @@ public class H5 implements java.io.Serializable {
* @return a valid parent class object identifier if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native long H5Pget_class_parent(long plid) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pequal determines if two property lists or classes are equal
*
* @param plid1
@@ -7219,11 +7902,13 @@ public class H5 implements java.io.Serializable {
* @return positive value if equal; zero if unequal, a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Pequal(long plid1, long plid2) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pequal determines if two property lists or classes are equal
*
* @param plid1
@@ -7234,7 +7919,7 @@ public class H5 implements java.io.Serializable {
* @return TRUE if equal, FALSE if unequal
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public static boolean H5P_equal(long plid1, long plid2) throws HDF5LibraryException
{
@@ -7244,6 +7929,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5P
+ *
* H5Pisa_class checks to determine whether a property list is a member of the specified class
*
* @param plist
@@ -7253,11 +7940,13 @@ public class H5 implements java.io.Serializable {
* @return a positive value if equal; zero if unequal; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Pisa_class(long plist, long pclass) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pcopy_prop copies a property from one property list or class to another
*
* @param dst_id
@@ -7269,12 +7958,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Pcopy_prop(long dst_id, long src_id, String name)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Premove removes a property from a property list
*
* @param plid
@@ -7284,11 +7975,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Premove(long plid, String name) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Punregister removes a property from a property list class
*
* @param plid
@@ -7298,11 +7991,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native int H5Punregister(long plid, String name) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* Closes an existing property list class
*
* @param plid
@@ -7310,7 +8005,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public static int H5Pclose_class(long plid) throws HDF5LibraryException
{
@@ -7326,6 +8021,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Pclose_class(long plid) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pclose terminates access to a property list.
*
* @param plist
@@ -7333,7 +8030,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Pclose(long plist) throws HDF5LibraryException
{
@@ -7349,6 +8046,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Pclose(long plist) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pcopy copies an existing property list to create a new property list.
*
* @param plist
@@ -7357,7 +8056,7 @@ public class H5 implements java.io.Serializable {
* @return a property list identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Pcopy(long plist) throws HDF5LibraryException
{
@@ -7394,6 +8093,8 @@ public class H5 implements java.io.Serializable {
// typedef herr_t (*H5P_iterate_t)(hid_t id, const char *name, void *iter_data);
/**
+ * @ingroup JH5P
+ *
* H5Pcreate_class_nocb creates an new property class with no callback functions.
*
* @param parent_class
@@ -7404,7 +8105,7 @@ public class H5 implements java.io.Serializable {
* @return a property list identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Pcreate_class_nocb(long parent_class, String name) throws HDF5LibraryException
{
@@ -7440,6 +8141,8 @@ public class H5 implements java.io.Serializable {
// H5P_cls_close_func_t close_data) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pregister2_nocb registers a property list with no callback functions.
*
* @param plist_class
@@ -7452,7 +8155,7 @@ public class H5 implements java.io.Serializable {
* IN: Default value of the property
*
* @exception HDF5LibraryException
- * - Error from the HDF-5 Library.
+ * - Error from the HDF5 Library.
**/
public synchronized static native void H5Pregister2_nocb(long plist_class, String name, long size,
byte[] def_value) throws HDF5LibraryException;
@@ -7463,6 +8166,8 @@ public class H5 implements java.io.Serializable {
// H5P_prp_compare_func_cb prp_cmp, H5P_prp_close_func_cb prp_close) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pinsert2_nocb inserts a property list with no callback functions.
*
* @param plist
@@ -7475,7 +8180,7 @@ public class H5 implements java.io.Serializable {
* IN: Default value of the property
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Pinsert2_nocb(long plist, String name, long size, byte[] value)
throws HDF5LibraryException;
@@ -7486,6 +8191,8 @@ public class H5 implements java.io.Serializable {
// H5P_prp_close_func_cb prp_close) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Piterate iterates over the properties in a property list or class
*
* @param plist
@@ -7501,7 +8208,7 @@ public class H5 implements java.io.Serializable {
* zero if all properties have been processed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
*
@@ -7512,6 +8219,8 @@ public class H5 implements java.io.Serializable {
// /////// Object creation property list (OCPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_attr_phase_change retrieves attribute storage phase change thresholds.
*
* @param ocpl_id
@@ -7527,7 +8236,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
*
@@ -7536,6 +8245,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_attr_phase_change sets threshold values for attribute storage on an object. These
* thresholds determine the point at which attribute storage changes
* from compact storage (i.e., storage in the object header)
@@ -7549,7 +8260,7 @@ public class H5 implements java.io.Serializable {
* IN: Minimum number of attributes to be stored in dense storage (Default: 6)
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_attr_phase_change(long ocpl_id, int max_compact,
@@ -7557,6 +8268,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_attr_creation_order retrieves the settings for tracking and indexing attribute creation order on
* an object.
*
@@ -7566,13 +8279,15 @@ public class H5 implements java.io.Serializable {
* @return Flags specifying whether to track and index attribute creation order
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_attr_creation_order(long ocpl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_attr_creation_order sets flags specifying whether to track and index attribute creation order on
* an object.
*
@@ -7584,13 +8299,15 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_attr_creation_order(long ocpl_id, int crt_order_flags)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_obj_track_times queries the object creation property list, ocpl_id, to determine whether object
* times are being recorded.
*
@@ -7600,13 +8317,15 @@ public class H5 implements java.io.Serializable {
* @return TRUE or FALSE, specifying whether object times are being recorded
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native boolean H5Pget_obj_track_times(long ocpl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_obj_track_times sets a property in the object creation property list, ocpl_id, that governs the
* recording of times associated with an object.
*
@@ -7617,13 +8336,15 @@ public class H5 implements java.io.Serializable {
* IN: TRUE or FALSE, specifying whether object times are to be tracked
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_obj_track_times(long ocpl_id, boolean track_times)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pmodify_filter modifies the specified FILTER in the transient or permanent output filter pipeline
* depending on whether PLIST is a dataset creation or dataset
* transfer property list. The FLAGS argument specifies certain
@@ -7663,7 +8384,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name or an array is null.
*
@@ -7673,6 +8394,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_filter adds the specified filter and corresponding properties to the end of an output filter
* pipeline.
*
@@ -7690,12 +8413,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_filter(long plist, int filter, int flags, long cd_nelmts,
int[] cd_values) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_nfilters returns the number of filters defined in the filter pipeline associated with the
* property list plist.
*
@@ -7705,11 +8430,13 @@ public class H5 implements java.io.Serializable {
* @return the number of filters in the pipeline if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pget_nfilters(long plist) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_filter returns information about a filter, specified by its filter number, in a filter pipeline,
* specified by the property list with which it is associated.
*
@@ -7738,7 +8465,7 @@ public class H5 implements java.io.Serializable {
* @exception ArrayStoreException
* Fatal error on Copyback
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name or an array is null.
*
@@ -7752,6 +8479,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5P
+ *
* H5Pget_filter2 returns information about a filter, specified by its filter number, in a filter
* pipeline, specified by the property list with which it is associated.
*
@@ -7766,6 +8495,8 @@ public class H5 implements java.io.Serializable {
NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_filter_by_id returns information about the filter specified in filter_id, a filter identifier.
* plist_id must be a dataset or group creation property list and filter_id must be in the associated
* filter pipeline. The filter_id and flags parameters are used in the same manner as described in the
@@ -7798,7 +8529,7 @@ public class H5 implements java.io.Serializable {
* @return the filter identification number if successful. Otherwise returns H5Z_FILTER_ERROR (-1).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception ArrayIndexOutOfBoundsException
* Fatal error on Copyback
* @exception ArrayStoreException
@@ -7816,6 +8547,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5P
+ *
* H5Pget_filter_by_id2 returns information about a filter, specified by its filter id, in a filter
* pipeline, specified by the property list with which it is associated.
*
@@ -7839,7 +8572,7 @@ public class H5 implements java.io.Serializable {
* @return the filter identification number if successful. Otherwise returns H5Z_FILTER_ERROR (-1).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name or an array is null.
*
@@ -7850,6 +8583,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pall_filters_avail query to verify that all the filters set
* in the dataset creation property list are available currently.
*
@@ -7861,12 +8596,14 @@ public class H5 implements java.io.Serializable {
* FALSE if one or more filters not currently available.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Pall_filters_avail(long dcpl_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Premove_filter deletes a filter from the dataset creation property list;
* deletes all filters if filter is H5Z_FILTER_NONE
*
@@ -7878,12 +8615,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value and the size of the user block; if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Premove_filter(long obj_id, long filter)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_deflate sets the compression method for a dataset.
*
* @param plist
@@ -7894,11 +8633,13 @@ public class H5 implements java.io.Serializable {
* @return non-negative if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_deflate(long plist, int level) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fletcher32 sets Fletcher32 checksum of EDC for a dataset creation
* property list or group creation property list.
*
@@ -7908,7 +8649,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value and the size of the user block; if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_fletcher32(long plist)
throws HDF5LibraryException, NullPointerException;
@@ -7916,6 +8657,8 @@ public class H5 implements java.io.Serializable {
// /////// File creation property list (FCPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_userblock retrieves the size of a user block in a file creation property list.
*
* @param plist
@@ -7926,7 +8669,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value and the size of the user block; if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
**/
@@ -7934,6 +8677,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_userblock sets the user block size of a file creation property list.
*
* @param plist
@@ -7944,11 +8689,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_userblock(long plist, long size) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_sizes retrieves the size of the offsets and lengths used in an HDF5 file. This function is only
* valid for file creation property lists.
*
@@ -7964,7 +8711,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value with the sizes initialized; if successful;
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
* @exception IllegalArgumentException
@@ -7974,6 +8721,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_sizes sets the byte size of the offsets and lengths used to address objects in an HDF5 file.
*
* @param plist
@@ -7986,12 +8735,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_sizes(long plist, int sizeof_addr, int sizeof_size)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_sym_k retrieves the size of the symbol table B-tree 1/2 rank and the symbol table leaf node 1/2
* size.
*
@@ -8008,7 +8759,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
* @exception IllegalArgumentException
@@ -8018,6 +8769,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_sym_k sets the size of parameters used to control the symbol table nodes.
*
* @param plist
@@ -8030,12 +8783,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_sym_k(long plist, int ik, int lk)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_istore_k queries the 1/2 rank of an indexed storage B-tree.
*
* @param plist
@@ -8046,7 +8801,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* ik array is null.
**/
@@ -8054,6 +8809,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_istore_k sets the size of the parameter used to control the B-trees for indexing chunked
* datasets.
*
@@ -8065,11 +8822,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_istore_k(long plist, int ik) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_shared_mesg_nindexes retrieves number of shared object header message indexes in file creation
* property list.
*
@@ -8080,13 +8839,15 @@ public class H5 implements java.io.Serializable {
* this property list
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_shared_mesg_nindexes(long fcpl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_shared_mesg_nindexes sets the number of shared object header message indexes in the specified
* file creation property list.
*
@@ -8099,7 +8860,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid value of nindexes
*
@@ -8108,6 +8869,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_shared_mesg_index Retrieves the configuration settings for a shared message index.
*
* @param fcpl_id
@@ -8125,7 +8888,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* mesg_info is null.
* @exception IllegalArgumentException
@@ -8137,6 +8900,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_shared_mesg_index Configures the specified shared object header message index
*
* @param fcpl_id
@@ -8151,7 +8916,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid value of nindexes
*
@@ -8161,6 +8926,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_shared_mesg_phase_change retrieves shared object header message phase change information.
*
* @param fcpl_id
@@ -8177,7 +8944,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
*
@@ -8186,6 +8953,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_shared_mesg_phase_change sets shared object header message storage phase change thresholds.
*
* @param fcpl_id
@@ -8200,7 +8969,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_list and min_btree.
*
@@ -8210,6 +8979,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_file_space_strategy sets the file space management strategy for the file associated with fcpl_id
* to strategy. There are four strategies that applications can select and they are described in the
* Parameters section.
@@ -8236,7 +9007,7 @@ public class H5 implements java.io.Serializable {
* is not to be modified.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_list and min_btree.
*
@@ -8246,6 +9017,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_file_space_strategy provides the means for applications to manage the HDF5 file's file space
* strategy for their specific needs.
*
@@ -8259,7 +9032,7 @@ public class H5 implements java.io.Serializable {
* @return the current free-space strategy.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_list and min_btree.
*
@@ -8269,6 +9042,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_file_space_strategy_persist provides the means for applications to manage the HDF5 file's file
* space strategy for their specific needs.
*
@@ -8278,7 +9053,7 @@ public class H5 implements java.io.Serializable {
* @return the current free-space persistence.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_list and min_btree.
*
@@ -8287,6 +9062,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_file_space_strategy_threshold provides the means for applications to manage the HDF5 file's file
* space strategy for their specific needs.
*
@@ -8296,7 +9073,7 @@ public class H5 implements java.io.Serializable {
* @return the current free-space section threshold.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_list and min_btree.
*
@@ -8305,6 +9082,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_file_space_page_size retrieves the file space page size for aggregating small metadata or raw
* data.
*
@@ -8315,7 +9094,7 @@ public class H5 implements java.io.Serializable {
*
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_list and min_btree.
*
@@ -8324,6 +9103,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_file_space_page_size Sets the file space page size for paged aggregation.
*
* @param fcpl_id
@@ -8332,7 +9113,7 @@ public class H5 implements java.io.Serializable {
* @return the current file space page size.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_list and min_btree.
*
@@ -8343,6 +9124,8 @@ public class H5 implements java.io.Serializable {
// /////// File access property list (FAPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_alignment retrieves the current settings for alignment properties from a file access property
* list.
*
@@ -8358,7 +9141,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* alignment array is null.
* @exception IllegalArgumentException
@@ -8368,6 +9151,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_alignment sets the alignment properties of a file access property list so that any file object
* &gt;= THRESHOLD bytes will be aligned on an address which is a multiple of ALIGNMENT.
*
@@ -8381,12 +9166,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_alignment(long plist, long threshold, long alignment)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_driver returns the identifier of the low-level file driver associated with the file access
* property list or data transfer property list plid.
*
@@ -8395,11 +9182,13 @@ public class H5 implements java.io.Serializable {
* @return a valid low-level driver identifier if successful; a negative value if failed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*/
public synchronized static native long H5Pget_driver(long plid) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_family_offset gets offset for family driver.
*
* @param fapl_id
@@ -8408,12 +9197,14 @@ public class H5 implements java.io.Serializable {
* @return the offset.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native long H5Pget_family_offset(long fapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_family_offset sets the offset for family driver.
*
* @param fapl_id
@@ -8424,13 +9215,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_family_offset(long fapl_id, long offset)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* Retrieves the maximum possible number of elements in the meta data cache and the maximum possible
* number of bytes and the RDCC_W0 value in the raw data chunk cache.
*
@@ -8448,7 +9241,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an array is null.
**/
@@ -8457,6 +9250,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_cache sets the number of elements (objects) in the meta data cache and the total number of bytes
* in the raw data chunk cache.
*
@@ -8474,13 +9269,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_cache(long plist, int mdc_nelmts, long rdcc_nelmts,
long rdcc_nbytes, double rdcc_w0)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_mdc_config gets the initial metadata cache configuration contained in a file access property
* list. This configuration is used when the file is opened.
*
@@ -8490,12 +9287,14 @@ public class H5 implements java.io.Serializable {
* @return A buffer(H5AC_cache_config_t) for the current metadata cache configuration information
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native H5AC_cache_config_t H5Pget_mdc_config(long plist_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_mdc_config sets the initial metadata cache configuration contained in a file access property
* list and loads it into the instance of H5AC_cache_config_t pointed to by the config_ptr parameter. This
* configuration is used when the file is opened.
@@ -8506,12 +9305,14 @@ public class H5 implements java.io.Serializable {
* IN: H5AC_cache_config_t, the initial metadata cache configuration.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Pset_mdc_config(long plist_id, H5AC_cache_config_t config_ptr)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_gc_references Returns the current setting for the garbage collection references property from a
* file access property list.
*
@@ -8521,11 +9322,13 @@ public class H5 implements java.io.Serializable {
* @return GC is on (true) or off (false)
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Pget_gc_references(long fapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_gc_references Sets the flag for garbage collecting references for the file. Default value for
* garbage collecting references is off.
*
@@ -8537,12 +9340,14 @@ public class H5 implements java.io.Serializable {
* @return non-negative if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_gc_references(long fapl_id, boolean gc_ref)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fclose_degree returns the degree for the file close behavior for a file access
* property list.
*
@@ -8552,12 +9357,14 @@ public class H5 implements java.io.Serializable {
* @return the degree for the file close behavior
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pget_fclose_degree(long fapl_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fclose_degree sets the degree for the file close behavior.
*
* @param fapl_id
@@ -8568,12 +9375,14 @@ public class H5 implements java.io.Serializable {
* @return non-negative if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_fclose_degree(long fapl_id, int degree)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_meta_block_size the current metadata block size setting.
*
* @param fapl_id
@@ -8582,12 +9391,14 @@ public class H5 implements java.io.Serializable {
* @return the minimum size, in bytes, of metadata block allocations.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native long H5Pget_meta_block_size(long fapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_meta_block_size sets the minimum metadata block size.
*
* @param fapl_id
@@ -8596,13 +9407,15 @@ public class H5 implements java.io.Serializable {
* IN: Minimum size, in bytes, of metadata block allocations.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_meta_block_size(long fapl_id, long size)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_sieve_buf_size retrieves the current settings for the data sieve buffer size
* property from a file access property list.
*
@@ -8612,11 +9425,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value and the size of the user block; if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Pget_sieve_buf_size(long fapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_sieve_buf_size Sets the maximum size of the data seive buffer used for file
* drivers which are capable of using data sieving. The data sieve
* buffer is used when performing I/O on datasets in the file. Using a
@@ -8634,12 +9449,14 @@ public class H5 implements java.io.Serializable {
* IN: maximum size of the data seive buffer.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Pset_sieve_buf_size(long fapl_id, long size)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_small_data_block_size retrieves the size of a block of small data in a file creation property
* list.
*
@@ -8649,12 +9466,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value and the size of the user block; if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Pget_small_data_block_size(long plist)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_small_data_block_size reserves blocks of size bytes for the contiguous storage of the raw data
* portion of small datasets.
*
@@ -8666,12 +9485,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_small_data_block_size(long plist, long size)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_libver_bounds retrieves the lower and upper bounds on the HDF5 Library versions that indirectly
* determine the object formats versions used when creating objects in the file.
*
@@ -8688,7 +9509,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
*
@@ -8697,6 +9518,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_libver_bounds Sets bounds on library versions, and indirectly format versions, to be used when
* creating objects
*
@@ -8711,7 +9534,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Argument is Illegal
*
@@ -8720,6 +9543,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_elink_file_cache_size retrieves the size of the external link open file cache.
*
* @param fapl_id
@@ -8728,13 +9553,15 @@ public class H5 implements java.io.Serializable {
* @return External link open file cache size in number of files.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_elink_file_cache_size(long fapl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_elink_file_cache_size sets the number of files that can be held open in an external link open
* file cache.
*
@@ -8744,13 +9571,15 @@ public class H5 implements java.io.Serializable {
* IN: External link open file cache size in number of files.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_elink_file_cache_size(long fapl_id, int efc_size)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_mdc_log_options sets metadata cache logging options.
*
* @param fapl_id
@@ -8763,7 +9592,7 @@ public class H5 implements java.io.Serializable {
* IN: Whether the logging begins as soon as the file is opened or created.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* location is null.
*
@@ -8773,6 +9602,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_mdc_log_options gets metadata cache logging options.
*
* @param fapl_id
@@ -8786,13 +9617,15 @@ public class H5 implements java.io.Serializable {
* @return the location of log in UTF-8/ASCII (file path/name) (On Windows, this must be ASCII).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native String H5Pget_mdc_log_options(long fapl_id, boolean[] mdc_log_options)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_metadata_read_attempts retrieves the number of read attempts that is set in the file access
* property list plist_id.
*
@@ -8802,13 +9635,15 @@ public class H5 implements java.io.Serializable {
* @return The number of read attempts.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native long H5Pget_metadata_read_attempts(long plist_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_metadata_read_attempts sets the number of reads that the library will try when reading
* checksummed metadata in an HDF5 file opened with SWMR access. When reading such metadata, the library
* will compare the checksum computed for the metadata just read with the checksum stored within the piece
@@ -8823,13 +9658,15 @@ public class H5 implements java.io.Serializable {
* IN: The number of read attempts which is a value greater than 0.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_metadata_read_attempts(long plist_id, long attempts)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_evict_on_close retrieves the file access property list setting that determines whether an HDF5
* object will be evicted from the library's metadata cache when it is closed.
*
@@ -8839,12 +9676,14 @@ public class H5 implements java.io.Serializable {
* @return indication if the object will be evicted on close.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native boolean H5Pget_evict_on_close(long fapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_evict_on_close controls the library's behavior of evicting metadata associated with a closed
* object.
*
@@ -8854,13 +9693,15 @@ public class H5 implements java.io.Serializable {
* IN: Whether the HDF5 object should be evicted on close.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_evict_on_close(long fapl_id, boolean evict_on_close)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_use_file_locking retrieves whether we are using file locking.
*
* @param fapl_id
@@ -8869,13 +9710,15 @@ public class H5 implements java.io.Serializable {
* @return indication if file locking is used.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native boolean H5Pget_use_file_locking(long fapl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_use_file_locking retrieves whether we ignore file locks when they are disabled.
*
* @param fapl_id
@@ -8884,13 +9727,15 @@ public class H5 implements java.io.Serializable {
* @return indication if file locking is ignored.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native boolean H5Pget_ignore_disabled_file_locking(long fapl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_file_locking sets parameters related to file locking.
*
* @param fapl_id
@@ -8904,7 +9749,7 @@ public class H5 implements java.io.Serializable {
* IN: Whether file locking will be ignored when disabled on a file system (useful for Lustre).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_file_locking(long fapl_id, boolean use_file_locking,
@@ -8919,6 +9764,8 @@ public class H5 implements java.io.Serializable {
// Dataset creation property list (DCPL) routines //
/**
+ * @ingroup JH5P
+ *
* H5Pget_layout returns the layout of the raw data for a dataset.
*
* @param plist
@@ -8928,11 +9775,13 @@ public class H5 implements java.io.Serializable {
* H5D_LAYOUT_ERROR (-1).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pget_layout(long plist) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_layout sets the type of storage used store the raw data for a dataset.
*
* @param plist
@@ -8943,11 +9792,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_layout(long plist, int layout) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_chunk retrieves the size of chunks for the raw data of a chunked layout dataset.
*
* @param plist
@@ -8960,7 +9811,7 @@ public class H5 implements java.io.Serializable {
* @return chunk dimensionality successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dims array is null.
* @exception IllegalArgumentException
@@ -8970,6 +9821,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_chunk sets the size of the chunks used to store a chunked layout dataset.
*
* @param plist
@@ -8982,7 +9835,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dims array is null.
* @exception IllegalArgumentException
@@ -8992,6 +9845,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_chunk sets the size of the chunks used to store a chunked layout dataset.
*
* @param plist
@@ -9004,7 +9859,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5Exception
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dims array is null.
* @exception IllegalArgumentException
@@ -9028,6 +9883,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5P
+ *
* H5Pset_virtual maps elements of the virtual dataset (VDS) described by the
* virtual dataspace identifier vspace_id to the elements of the source dataset
* described by the source dataset dataspace identifier src_space_id. The source
@@ -9051,7 +9908,7 @@ public class H5 implements java.io.Serializable {
* selection.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an name string is null.
* @exception IllegalArgumentException
@@ -9062,6 +9919,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_count gets the number of mappings for a virtual dataset that has the creation property
* list specified by dcpl_id.
*
@@ -9071,7 +9930,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative number of mappings if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* An id is &lt;=0
**/
@@ -9079,6 +9938,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_vspace takes the dataset creation property list for the virtual dataset, dcpl_id, and
* the mapping index, index, and returns a dataspace identifier for the selection within the virtual
* dataset used in the mapping.
@@ -9091,7 +9952,7 @@ public class H5 implements java.io.Serializable {
* @return a valid dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* An id is &lt;=0
**/
@@ -9099,6 +9960,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_srcspace takes the dataset creation property list for the virtual dataset, dcpl_id, and
* the mapping index, index, and returns a dataspace identifier for the selection within the source
* dataset used in the mapping.
@@ -9111,7 +9974,7 @@ public class H5 implements java.io.Serializable {
* @return a valid dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* An id is &lt;=0
**/
@@ -9119,6 +9982,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_filename takes the dataset creation property list for the virtual dataset, dcpl_id, the
* mapping index, index, the size of the filename for a source dataset, size, and retrieves the name of
* the file for a source dataset used in the mapping.
@@ -9131,7 +9996,7 @@ public class H5 implements java.io.Serializable {
* @return the name of the file containing the source dataset if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* An id is &lt;=0
**/
@@ -9139,6 +10004,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_dsetname takes the dataset creation property list for the virtual dataset, dcpl_id, the
* mapping index, index, the size of the dataset name for a source dataset, size, and retrieves the name
* of the source dataset used in the mapping.
@@ -9151,7 +10018,7 @@ public class H5 implements java.io.Serializable {
* @return the name of the source dataset if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* An id is &lt;=0
**/
@@ -9168,7 +10035,7 @@ public class H5 implements java.io.Serializable {
// * @return VDS link open file cache size in number of files.
// *
// * @exception HDF5LibraryException
- // * Error from the HDF-5 Library.
+ // * Error from the HDF5 Library.
// *
// **/
// public synchronized static native int H5Pget_vds_file_cache_size(long fapl_id) throws
@@ -9184,13 +10051,15 @@ public class H5 implements java.io.Serializable {
// * IN: VDS link open file cache size in number of files.
// *
// * @exception HDF5LibraryException
- // * Error from the HDF-5 Library.
+ // * Error from the HDF5 Library.
// *
// **/
// public synchronized static native void H5Pset_vds_file_cache_size(long fapl_id, int efc_size)
// throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_external returns information about an external file.
*
* @param plist
@@ -9217,7 +10086,7 @@ public class H5 implements java.io.Serializable {
* @exception ArrayStoreException
* Fatal error on Copyback
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name or size is null.
* @exception IllegalArgumentException
@@ -9230,6 +10099,8 @@ public class H5 implements java.io.Serializable {
NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_external adds an external file to the list of external files.
*
* @param plist
@@ -9245,7 +10116,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -9253,6 +10124,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_external_count returns the number of external files for the specified dataset.
*
* @param plist
@@ -9261,11 +10134,13 @@ public class H5 implements java.io.Serializable {
* @return the number of external files if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pget_external_count(long plist) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_szip Sets up the use of the szip filter.
*
* @param plist
@@ -9278,13 +10153,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_szip(long plist, int options_mask, int pixels_per_block)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_shuffle Sets up the use of the shuffle filter.
*
* @param plist_id
@@ -9293,13 +10170,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_shuffle(long plist_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_nbit Sets up the use of the N-Bit filter.
*
* @param plist_id
@@ -9308,12 +10187,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_nbit(long plist_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_scaleoffset sets the Scale-Offset filter for a dataset.
*
* @param plist_id
@@ -9326,7 +10207,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid arguments
*
@@ -9335,6 +10216,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fill_value queries the fill value property of a dataset creation property list.
*
* @param plist_id
@@ -9353,6 +10236,8 @@ public class H5 implements java.io.Serializable {
throws HDF5Exception;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fill_value queries the fill value property of a dataset creation property list.
*
* @param plist_id
@@ -9381,6 +10266,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5P
+ *
* H5Pset_fill_value sets the fill value for a dataset creation property list.
*
* @param plist_id
@@ -9399,6 +10286,8 @@ public class H5 implements java.io.Serializable {
throws HDF5Exception;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fill_value sets the fill value for a dataset creation property list.
*
* @param plist_id
@@ -9427,6 +10316,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5P
+ *
* H5Pset_fill_value checks if the fill value is defined for a dataset creation property list.
*
* @param plist_id
@@ -9447,6 +10338,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_alloc_time Gets space allocation time for dataset during creation.
*
* @param plist_id
@@ -9457,13 +10350,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_alloc_time(long plist_id, int[] alloc_time)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_alloc_time Sets space allocation time for dataset during creation.
*
* @param plist_id
@@ -9474,13 +10369,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_alloc_time(long plist_id, int alloc_time)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fill_time Gets fill value writing time.
*
* @param plist_id
@@ -9491,13 +10388,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_fill_time(long plist_id, int[] fill_time)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fill_time Sets the fill value writing time.
*
* @param plist_id
@@ -9508,13 +10407,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fill_time(long plist_id, int fill_time)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_chunk_opts Sets the edge chunk option in a dataset creation property list.
*
* @param dcpl_id
@@ -9525,12 +10426,14 @@ public class H5 implements java.io.Serializable {
* 0 - Disables option; partial edge chunks will be compressed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library
+ * Error from the HDF5 Library
**/
public synchronized static native void H5Pset_chunk_opts(long dcpl_id, int opts)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_chunk_opts retrieves the edge chunk option setting stored in the dataset creation property list
*
* @param dcpl_id
@@ -9539,12 +10442,14 @@ public class H5 implements java.io.Serializable {
* @return The edge chunk option setting.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library
+ * Error from the HDF5 Library
*
*/
public synchronized static native int H5Pget_chunk_opts(long dcpl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_dset_no_attrs_hint accesses the flag for whether or not datasets created by the given dcpl
* will be created with a "minimized" object header.
*
@@ -9554,12 +10459,14 @@ public class H5 implements java.io.Serializable {
* @return true if the given dcpl is set to create minimized dataset object headers, false if not.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Pget_dset_no_attrs_hint(long dcpl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_dset_no_attrs_hint sets the dcpl to minimize (or explicitly to not minimized) dataset object
* headers upon creation.
*
@@ -9570,7 +10477,7 @@ public class H5 implements java.io.Serializable {
* IN: the minimize hint setting
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Pset_dset_no_attrs_hint(long dcpl_id, boolean minimize)
throws HDF5LibraryException;
@@ -9578,6 +10485,8 @@ public class H5 implements java.io.Serializable {
// /////// Dataset access property list (DAPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* Retrieves the maximum possible number of elements in the meta data cache and the maximum possible
* number of bytes and the RDCC_W0 value in the raw data chunk cache on a per-datset basis.
*
@@ -9591,7 +10500,7 @@ public class H5 implements java.io.Serializable {
* IN/OUT: Preemption policy.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an array is null.
**/
@@ -9600,6 +10509,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_chunk_cache sets the number of elements (objects) in the meta data cache and the total number of
* bytes in the raw data chunk cache on a per-datset basis.
*
@@ -9613,13 +10524,15 @@ public class H5 implements java.io.Serializable {
* IN: Preemption policy.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Pset_chunk_cache(long dapl_id, long rdcc_nslots,
long rdcc_nbytes, double rdcc_w0)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_virtual_view takes the access property list for the virtual dataset, dapl_id, and the flag,
* view, and sets the VDS view according to the flag value.
*
@@ -9629,12 +10542,14 @@ public class H5 implements java.io.Serializable {
* IN: Flag specifying the extent of the data to be included in the view.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library
+ * Error from the HDF5 Library
**/
public synchronized static native void H5Pset_virtual_view(long dapl_id, int view)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_view takes the virtual dataset access property list, dapl_id, and retrieves the flag,
* view, set by the H5Pset_virtual_view call.
*
@@ -9644,12 +10559,14 @@ public class H5 implements java.io.Serializable {
* @return The flag specifying the view of the virtual dataset.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library
+ * Error from the HDF5 Library
*
*/
public synchronized static native int H5Pget_virtual_view(long dapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_virtual_printf_gap sets the access property list for the virtual dataset, dapl_id, to instruct
* the library to stop looking for the mapped data stored in the files and/or datasets with the
* printf-style names after not finding gap_size files and/or datasets. The found source files and
@@ -9662,12 +10579,14 @@ public class H5 implements java.io.Serializable {
* the extent of an unlimited virtual dataset with printf-style mappings.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library
+ * Error from the HDF5 Library
**/
public synchronized static native void H5Pset_virtual_printf_gap(long dapl_id, long gap_size)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_printf_gap returns the maximum number of missing printf-style files and/or datasets for
* determining the extent of an unlimited virtual dataaset, gap_size, using the access property list for
* the virtual dataset, dapl_id.
@@ -9679,13 +10598,15 @@ public class H5 implements java.io.Serializable {
* the extent of an unlimited virtual dataset with printf-style mappings.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library
+ * Error from the HDF5 Library
*
*/
public synchronized static native long H5Pget_virtual_printf_gap(long dapl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_virtual_prefix Retrieves prefix applied to virtual file paths.
*
* @param dapl_id
@@ -9694,12 +10615,14 @@ public class H5 implements java.io.Serializable {
* @return the prefix to be applied to virtual file paths.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native String H5Pget_virtual_prefix(long dapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_virtual_prefix Sets prefix to be applied to virtual file paths.
*
* @param dapl_id
@@ -9708,7 +10631,7 @@ public class H5 implements java.io.Serializable {
* IN: Prefix to be applied to virtual file paths
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* prefix is null.
*
@@ -9717,6 +10640,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_efile_prefix Retrieves prefix applied to external file paths.
*
* @param dapl_id
@@ -9725,12 +10650,14 @@ public class H5 implements java.io.Serializable {
* @return the prefix to be applied to external file paths.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native String H5Pget_efile_prefix(long dapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_efile_prefix Sets prefix to be applied to external file paths.
*
* @param dapl_id
@@ -9739,7 +10666,7 @@ public class H5 implements java.io.Serializable {
* IN: Prefix to be applied to external file paths
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* prefix is null.
*
@@ -9756,6 +10683,8 @@ public class H5 implements java.io.Serializable {
// /////// Dataset xfer property list (DXPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_data_transform retrieves the data transform expression previously set in the dataset transfer
* property list plist_id by H5Pset_data_transform.
*
@@ -9771,7 +10700,7 @@ public class H5 implements java.io.Serializable {
*
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Size is &lt;= 0.
*
@@ -9781,6 +10710,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_data_transform sets a data transform expression
*
* @param plist_id
@@ -9791,7 +10722,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* expression is null.
*
@@ -9800,7 +10731,9 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
- * HH5Pget_buffer gets type conversion and background buffers. Returns buffer size, in bytes, if
+ * @ingroup JH5P
+ *
+ * H5Pget_buffer gets type conversion and background buffers. Returns buffer size, in bytes, if
* successful; otherwise 0 on failure.
*
* @param plist
@@ -9813,7 +10746,7 @@ public class H5 implements java.io.Serializable {
* @return buffer size, in bytes, if successful; otherwise 0 on failure
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* plist is invalid.
**/
@@ -9821,6 +10754,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_buffer_size gets type conversion and background buffer size, in bytes, if successful;
* otherwise 0 on failure.
*
@@ -9830,7 +10765,7 @@ public class H5 implements java.io.Serializable {
* @return buffer size, in bytes, if successful; otherwise 0 on failure
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* plist is invalid.
**/
@@ -9838,6 +10773,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_buffer sets type conversion and background buffers. status to TRUE or FALSE.
*
* Given a dataset transfer property list, H5Pset_buffer sets the maximum size for the type conversion
@@ -9858,7 +10795,7 @@ public class H5 implements java.io.Serializable {
* Size, in bytes, of the type conversion and background buffers.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* plist is invalid.
**/
@@ -9866,6 +10803,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_edc_check gets the error-detecting algorithm in use.
*
* @param plist
@@ -9874,11 +10813,13 @@ public class H5 implements java.io.Serializable {
* @return the error-detecting algorithm
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pget_edc_check(long plist) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_edc_check sets the error-detecting algorithm.
*
* @param plist
@@ -9889,11 +10830,13 @@ public class H5 implements java.io.Serializable {
* @return non-negative if succeed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_edc_check(long plist, int check) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_btree_ratio Get the B-tree split ratios for a dataset transfer property list.
*
* @param plist_id
@@ -9908,7 +10851,7 @@ public class H5 implements java.io.Serializable {
* @return non-negative if succeed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
**/
@@ -9917,6 +10860,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_btree_ratio Sets B-tree split ratios for a dataset transfer property list. The split ratios
* determine what percent of children go in the first node when a node splits.
*
@@ -9932,12 +10877,14 @@ public class H5 implements java.io.Serializable {
* @return non-negative if succeed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Pset_btree_ratios(long plist_id, double left, double middle,
double right) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_hyper_vector_size reads values previously set with H5Pset_hyper_vector_size.
*
* @param dxpl_id
@@ -9948,13 +10895,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_hyper_vector_size(long dxpl_id, long[] vector_size)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_hyper_vector_size sets the number of
* "I/O vectors" (offset and length pairs) which are to be
* accumulated in memory before being issued to the lower levels
@@ -9974,7 +10923,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_hyper_vector_size(long dxpl_id, long vector_size)
@@ -9983,6 +10932,8 @@ public class H5 implements java.io.Serializable {
// /////// Link creation property list (LCPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_create_intermediate_group determines whether property is set to enable creating missing
* intermediate groups.
*
@@ -9992,13 +10943,15 @@ public class H5 implements java.io.Serializable {
* @return Boolean true or false
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native boolean H5Pget_create_intermediate_group(long lcpl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_create_intermediate_group specifies in property list whether to create missing intermediate
* groups
*
@@ -10010,7 +10963,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_create_intermediate_group(long lcpl_id,
@@ -10020,6 +10973,8 @@ public class H5 implements java.io.Serializable {
// /////// Group creation property list (GCPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_local_heap_size_hint Retrieves the anticipated size of the local heap for original-style groups.
*
* @param gcpl_id
@@ -10028,13 +10983,15 @@ public class H5 implements java.io.Serializable {
* @return size_hint, the anticipated size of local heap
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native long H5Pget_local_heap_size_hint(long gcpl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_local_heap_size_hint Specifies the anticipated maximum size of a local heap.
*
* @param gcpl_id
@@ -10045,13 +11002,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_local_heap_size_hint(long gcpl_id, long size_hint)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_link_phase_change Queries the settings for conversion between compact and dense groups.
*
* @param gcpl_id
@@ -10068,7 +11027,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* size is null.
*
@@ -10077,6 +11036,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_link_phase_change Sets the parameters for conversion between compact and dense groups.
*
* @param gcpl_id
@@ -10089,7 +11050,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values of max_compact and min_dense.
*
@@ -10099,6 +11060,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_est_link_info Queries data required to estimate required local heap or object header size.
*
* @param gcpl_id
@@ -10115,7 +11078,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* link_info is null.
*
@@ -10124,6 +11087,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_est_link_info Sets estimated number of links and length of link names in a group.
*
* @param gcpl_id
@@ -10136,7 +11101,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid values to est_num_entries and est_name_len.
*
@@ -10146,6 +11111,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_link_creation_order queries the group creation property list, gcpl_id, and returns a flag
* indicating whether link creation order is tracked and/or indexed in a group.
*
@@ -10155,13 +11122,15 @@ public class H5 implements java.io.Serializable {
* @return crt_order_flags -Creation order flag(s)
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_link_creation_order(long gcpl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_link_creation_order Sets flags in a group creation property list, gcpl_id, for tracking and/or
* indexing links on creation order.
*
@@ -10174,7 +11143,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_link_creation_order(long gcpl_id, int crt_order_flags)
@@ -10183,6 +11152,8 @@ public class H5 implements java.io.Serializable {
// /////// String creation property list (STRCPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_char_encoding gets the character encoding of the string.
*
* @param plist_id
@@ -10191,12 +11162,14 @@ public class H5 implements java.io.Serializable {
* @return Returns the character encoding of the string.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_char_encoding(long plist_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_char_encoding sets the character encoding of the string.
*
* @param plist_id
@@ -10205,7 +11178,7 @@ public class H5 implements java.io.Serializable {
* IN: the character encoding of the string
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_char_encoding(long plist_id, int encoding)
@@ -10214,6 +11187,8 @@ public class H5 implements java.io.Serializable {
// /////// Link access property list (LAPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_nlinks retrieves the maximum number of soft or user-defined link traversals allowed, nlinks,
* before the library assumes it has found a cycle and aborts the traversal. This value is retrieved from
* the link access property list lapl_id.
@@ -10224,12 +11199,14 @@ public class H5 implements java.io.Serializable {
* @return Returns a Maximum number of links to traverse.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native long H5Pget_nlinks(long lapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_nlinks sets the maximum number of soft or user-defined link traversals allowed, nlinks, before
* the library assumes it has found a cycle and aborts the traversal. This value is set in the link access
* property list lapl_id.
@@ -10242,7 +11219,7 @@ public class H5 implements java.io.Serializable {
* @return Returns a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Argument is Illegal
*
@@ -10251,6 +11228,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, IllegalArgumentException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_elink_prefix Retrieves prefix applied to external link paths.
*
* @param lapl_id
@@ -10262,7 +11241,7 @@ public class H5 implements java.io.Serializable {
* the NULL terminator; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* prefix is null.
*
@@ -10271,6 +11250,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_elink_prefix Sets prefix to be applied to external link paths.
*
* @param lapl_id
@@ -10281,7 +11262,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* prefix is null.
*
@@ -10290,6 +11271,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_elink_fapl Retrieves the file access property list identifier associated with the link access
* property list.
*
@@ -10299,7 +11282,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public static long H5Pget_elink_fapl(long lapl_id) throws HDF5LibraryException
@@ -10316,6 +11299,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Pget_elink_fapl(long lapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_elink_fapl sets a file access property list for use in accessing a file pointed to by an
* external link.
*
@@ -10327,13 +11312,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_elink_fapl(long lapl_id, long fapl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_elink_acc_flags retrieves the external link traversal file access flag from the specified link
* access property list.
*
@@ -10343,12 +11330,14 @@ public class H5 implements java.io.Serializable {
* @return File access flag for link traversal.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_elink_acc_flags(long lapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_elink_acc_flags Sets the external link traversal file access flag in a link access property
* list.
*
@@ -10360,7 +11349,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception IllegalArgumentException
* Invalid Flag values.
*
@@ -10371,6 +11360,8 @@ public class H5 implements java.io.Serializable {
// /////// Object copy property list (OCPYPL) routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_copy_object retrieves the properties to be used when an object is copied.
*
* @param ocp_plist_id
@@ -10379,12 +11370,14 @@ public class H5 implements java.io.Serializable {
* @return Copy option(s) set in the object copy property list
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_copy_object(long ocp_plist_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_copy_object Sets properties to be used when an object is copied.
*
* @param ocp_plist_id
@@ -10393,7 +11386,7 @@ public class H5 implements java.io.Serializable {
* IN: Copy option(s) to be set
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pset_copy_object(long ocp_plist_id, int copy_options)
@@ -10402,6 +11395,8 @@ public class H5 implements java.io.Serializable {
// /////// file drivers property list routines ///////
/**
+ * @ingroup JH5P
+ *
* H5Pget_fapl_core retrieve H5FD_CORE I/O settings.
*
* @param fapl_id
@@ -10412,7 +11407,7 @@ public class H5 implements java.io.Serializable {
* OUT: write to file name on flush setting
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void H5Pget_fapl_core(long fapl_id, long[] increment,
@@ -10420,6 +11415,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_core modifies the file access property list to use the H5FD_CORE driver.
*
* @param fapl_id
@@ -10432,7 +11429,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_core(long fapl_id, long increment,
@@ -10440,6 +11437,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fapl_direct queries properties set by the H5Pset_fapl_direct.
*
* @param fapl_id
@@ -10452,13 +11451,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_fapl_direct(long fapl_id, long[] info)
throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_direct Sets up use of the direct I/O driver.
*
* @param fapl_id
@@ -10473,13 +11474,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_direct(long fapl_id, long alignment, long block_size,
long cbuf_size) throws HDF5LibraryException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fapl_family Returns information about the family file access property list.
*
* @param fapl_id
@@ -10492,7 +11495,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pget_fapl_family(long fapl_id, long[] memb_size,
@@ -10500,6 +11503,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_family Sets up use of the direct I/O driver.
*
* @param fapl_id
@@ -10512,13 +11517,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_family(long fapl_id, long memb_size, long memb_fapl_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_hdfs Modify the file access property list to use the H5FD_HDFS driver.
*
* @param fapl_id
@@ -10529,13 +11536,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_hdfs(long fapl_id, H5FD_hdfs_fapl_t fapl_conf)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fapl_hdfs gets the properties hdfs I/O driver.
*
* @param fapl_id
@@ -10544,13 +11553,15 @@ public class H5 implements java.io.Serializable {
* @return the properties of the hdfs driver.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native H5FD_hdfs_fapl_t H5Pget_fapl_hdfs(long fapl_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fapl_multi Sets up use of the multi I/O driver.
*
* @param fapl_id
@@ -10568,7 +11579,7 @@ public class H5 implements java.io.Serializable {
* @return a boolean value; Allows read-only access to incomplete file sets when TRUE.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an array is null.
*
@@ -10579,6 +11590,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_multi Sets up use of the multi I/O driver.
*
* @param fapl_id
@@ -10596,7 +11609,7 @@ public class H5 implements java.io.Serializable {
* IN: Allows read-only access to incomplete file sets when TRUE.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an array is null.
*
@@ -10607,6 +11620,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_log Sets up the logging virtual file driver (H5FD_LOG) for use. H5Pset_fapl_log modifies
* the file access property list to use the logging driver, H5FD_LOG. The logging virtual file driver
* (VFD) is a clone of the standard SEC2 (H5FD_SEC2) driver with additional facilities for logging VFD
@@ -10622,7 +11637,7 @@ public class H5 implements java.io.Serializable {
* IN: The size of the logging buffers, in bytes.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* logfile is null.
**/
@@ -10631,6 +11646,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_sec2 Sets up use of the sec2 I/O driver.
*
* @param fapl_id
@@ -10639,13 +11656,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_sec2(long fapl_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_split Sets up use of the split I/O driver. Makes the multi driver act like the
* old split driver which stored meta data in one file and raw
* data in another file
@@ -10662,7 +11681,7 @@ public class H5 implements java.io.Serializable {
* IN: File access property list identifier raw data
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native void
@@ -10670,6 +11689,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_stdio Sets up use of the stdio I/O driver.
*
* @param fapl_id
@@ -10678,13 +11699,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_stdio(long fapl_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_windows Sets up use of the windows I/O driver.
*
* @param fapl_id
@@ -10693,13 +11716,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_windows(long fapl_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pset_fapl_ros3 Modify the file access property list to use the H5FD_ROS3 driver.
*
* @param fapl_id
@@ -10710,13 +11735,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful; otherwise returns a negative value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native int H5Pset_fapl_ros3(long fapl_id, H5FD_ros3_fapl_t fapl_conf)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5P
+ *
* H5Pget_fapl_ros3 gets the properties of the ros3 I/O driver.
*
* @param fapl_id
@@ -10725,7 +11752,7 @@ public class H5 implements java.io.Serializable {
* @return the properties of the ros3 driver.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
*
**/
public synchronized static native H5FD_ros3_fapl_t H5Pget_fapl_ros3(long fapl_id)
@@ -10813,6 +11840,16 @@ public class H5 implements java.io.Serializable {
// //
// ////////////////////////////////////////////////////////////
/**
+ * @defgroup JH5PL Java Plugin (H5PL) Interface
+ *
+ * @see H5PL, C-API
+ *
+ * @see @ref H5PL_UG, User Guide
+ **/
+
+ /**
+ * @ingroup JH5PL
+ *
* H5PLset_loading_state uses one argument to enable or disable individual plugins.
* The plugin_flags parameter is an encoded integer in which each bit controls a specific
* plugin or class of plugins.
@@ -10834,12 +11871,14 @@ public class H5 implements java.io.Serializable {
*
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5PLset_loading_state(int plugin_flags)
throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLget_loading_state retrieves the state of the dynamic plugins flag, plugin_flags..
*
* @return the list of dynamic plugin types that are enabled or disabled.
@@ -10849,33 +11888,39 @@ public class H5 implements java.io.Serializable {
* If the value of plugin_flags is 0 (zero), all dynamic plugins are disabled.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5PLget_loading_state() throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLappend inserts the plugin path at the end of the table.
*
* @param plugin_path
* IN: Path for location of filter plugin libraries.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5PLappend(String plugin_path) throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLprepend inserts the plugin path at the beginning of the table.
*
* @param plugin_path
* IN: Path for location of filter plugin libraries.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5PLprepend(String plugin_path) throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLreplace replaces the plugin path at the specified index.
*
* @param plugin_path
@@ -10884,12 +11929,14 @@ public class H5 implements java.io.Serializable {
* IN: The table index (0-based).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5PLreplace(String plugin_path, int index)
throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLinsert inserts the plugin path at the specified index.
*
* @param plugin_path
@@ -10898,23 +11945,27 @@ public class H5 implements java.io.Serializable {
* IN: The table index (0-based).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5PLinsert(String plugin_path, int index)
throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLremove removes the plugin path at the specified index.
*
* @param index
* IN: The table index (0-based).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5PLremove(int index) throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLget retrieves the plugin path at the specified index.
*
* @param index
@@ -10923,29 +11974,256 @@ public class H5 implements java.io.Serializable {
* @return the current path at the index in plugin path table
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5PLget(int index) throws HDF5LibraryException;
/**
+ * @ingroup JH5PL
+ *
* H5PLsize retrieves the size of the current list of plugin paths.
*
* @return the current number of paths in the plugin path table
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5PLsize() throws HDF5LibraryException;
// ////////////////////////////////////////////////////////////
// //
- // H5R: HDF5 1.12 Reference API Functions //
+ // H5R: HDF5 1.8 Reference API Functions //
// //
// ////////////////////////////////////////////////////////////
- // Constructors //
+ /**
+ * @defgroup JH5R Java Reference (H5R) Interface
+ *
+ * @see H5R, C-API
+ *
+ * @see @ref H5R_UG, User Guide
+ **/
+
+ private synchronized static native int H5Rcreate(byte[] ref, long loc_id, String name, int ref_type,
+ long space_id)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
+
+ /**
+ * @ingroup JH5R
+ *
+ * H5Rcreate creates the reference, ref, of the type specified in ref_type, pointing to the object name
+ * located at loc_id.
+ *
+ * @param loc_id
+ * IN: Location identifier used to locate the object being pointed to.
+ * @param name
+ * IN: Name of object at location loc_id.
+ * @param ref_type
+ * IN: Type of reference.
+ * @param space_id
+ * IN: Dataspace identifier with selection.
+ *
+ * @return the reference (byte[]) if successful
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * an input array is null.
+ * @exception IllegalArgumentException
+ * an input array is invalid.
+ **/
+ public synchronized static byte[] H5Rcreate(long loc_id, String name, int ref_type, long space_id)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException
+ {
+ /* These sizes are correct for HDF5.1.2 */
+ int ref_size = 8;
+ if (ref_type == HDF5Constants.H5R_DATASET_REGION)
+ ref_size = 12;
+
+ byte rbuf[] = new byte[ref_size];
+
+ /* will raise an exception if fails */
+ H5Rcreate(rbuf, loc_id, name, ref_type, space_id);
+
+ return rbuf;
+ }
+
+ /**
+ * @ingroup JH5R
+ *
+ * Given a reference to some object, H5Rdereference opens that object and return an identifier.
+ *
+ * @param dataset
+ * IN: Dataset containing reference object.
+ * @param access_list
+ * IN: Property list of the object being referenced.
+ * @param ref_type
+ * IN: The reference type of ref.
+ * @param ref
+ * IN: reference to an object
+ *
+ * @return valid identifier if successful
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * output array is null.
+ * @exception IllegalArgumentException
+ * output array is invalid.
+ **/
+ public static long H5Rdereference(long dataset, long access_list, int ref_type, byte[] ref)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException
+ {
+ long id = _H5Rdereference(dataset, access_list, ref_type, ref);
+ if (id > 0) {
+ log.trace("OPEN_IDS: H5Rdereference add {}", id);
+ OPEN_IDS.add(id);
+ log.trace("OPEN_IDS: {}", OPEN_IDS.size());
+ }
+ return id;
+ }
+
+ private synchronized static native long _H5Rdereference(long dataset, long access_list, int ref_type,
+ byte[] ref)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
+
+ /**
+ * @ingroup JH5R
+ *
+ * H5Rget_name retrieves a name for the object identified by ref.
+ *
+ * @param loc_id
+ * IN: Identifier for the dataset containing the reference or for the group that dataset is in.
+ * @param ref_type
+ * IN: Type of reference.
+ * @param ref
+ * IN: An object or dataset region reference.
+ * @param name
+ * OUT: A name associated with the referenced object or dataset region.
+ * @param size
+ * IN: The size of the name buffer.
+ *
+ * @return Returns the length of the name if successful, returning 0 (zero) if no name is associated with
+ * the identifier. Otherwise returns a negative value.
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * size is null.
+ * @exception IllegalArgumentException
+ * Argument is illegal.
+ **/
+ public synchronized static native long H5Rget_name(long loc_id, int ref_type, byte[] ref, String[] name,
+ long size)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
+
+ /**
+ * @ingroup JH5R
+ *
+ * H5Rget_name_string retrieves a name for the object identified by ref.
+ *
+ * @param loc_id
+ * IN: Identifier for the dataset containing the reference or for the group that dataset is in.
+ * @param ref_type
+ * IN: Type of reference.
+ * @param ref
+ * IN: An object or dataset region reference.
+ *
+ * @return Returns the name if successful, returning null if no name is associated with
+ * the identifier.
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * size is null.
+ * @exception IllegalArgumentException
+ * Argument is illegal.
+ **/
+ public synchronized static native String H5Rget_name_string(long loc_id, int ref_type, byte[] ref)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
+ * H5Rget_obj_type Given a reference to an object ref, H5Rget_obj_type returns the type of the object
+ * pointed to.
+ *
+ * @param loc_id
+ * IN: loc_id of the reference object.
+ * @param ref_type
+ * IN: Type of reference to query.
+ * @param ref
+ * IN: the reference
+ *
+ * @return Returns the object type
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * an input array is null.
+ * @exception IllegalArgumentException
+ * an input array is invalid.
+ **/
+ public synchronized static native int H5Rget_obj_type(long loc_id, int ref_type, byte ref[])
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
+
+ /**
+ * @ingroup JH5R
+ *
+ * H5Rget_obj_type2 Retrieves the type of object that an object reference points to.
+ *
+ * @see public static int H5Rget_obj_type(int loc_id, int ref_type, byte ref[])
+ **/
+ private synchronized static native int H5Rget_obj_type2(long loc_id, int ref_type, byte ref[],
+ int[] obj_type)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
+
+ /**
+ * @ingroup JH5R
+ *
+ * Given a reference to an object ref, H5Rget_region creates a copy of the dataspace of the dataset
+ * pointed to and defines a selection in the copy which is the region pointed to.
+ *
+ * @param loc_id
+ * IN: loc_id of the reference object.
+ * @param ref_type
+ * IN: The reference type of ref.
+ * @param ref
+ * OUT: the reference to the object and region
+ *
+ * @return a valid identifier if successful
+ *
+ * @exception HDF5LibraryException
+ * Error from the HDF5 Library.
+ * @exception NullPointerException
+ * an input array is null.
+ * @exception IllegalArgumentException
+ * an input array is invalid.
+ **/
+ public static long H5Rget_region(long loc_id, int ref_type, byte[] ref)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException
+ {
+ long id = _H5Rget_region(loc_id, ref_type, ref);
+ if (id > 0) {
+ log.trace("OPEN_IDS: H5Rget_region add {}", id);
+ OPEN_IDS.add(id);
+ log.trace("OPEN_IDS: {}", OPEN_IDS.size());
+ }
+ return id;
+ }
+
+ private synchronized static native long _H5Rget_region(long loc_id, int ref_type, byte[] ref)
+ throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
+
+ // ////////////////////////////////////////////////////////////
+ // //
+ // H5R: HDF5 1.12 Reference API Functions //
+ // //
+ // ////////////////////////////////////////////////////////////
+
+ /**
+ * @ingroup JH5R
+ *
* H5Rcreate_object creates a reference pointing to the object named name located at loc id.
*
* @param loc_id
@@ -10958,7 +12236,7 @@ public class H5 implements java.io.Serializable {
* @return the reference (byte[]) if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -10968,6 +12246,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rcreate_region creates the reference, pointing to the region represented by
* space id within the object named name located at loc id.
*
@@ -10983,7 +12263,7 @@ public class H5 implements java.io.Serializable {
* @return the reference (byte[]) if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -10994,6 +12274,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rcreate_attr creates the reference, pointing to the attribute named attr name
* and attached to the object named name located at loc id.
*
@@ -11009,7 +12291,7 @@ public class H5 implements java.io.Serializable {
* @return the reference (byte[]) if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11020,13 +12302,15 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rdestroy destroys a reference and releases resources.
*
* @param ref_ptr
* IN: Reference to an object, region or attribute attached to an object.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11036,6 +12320,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rget_type retrieves the type of a reference.
*
* @param ref_ptr
@@ -11044,7 +12330,7 @@ public class H5 implements java.io.Serializable {
* @return a valid reference type if successful; otherwise returns H5R UNKNOWN.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11054,6 +12340,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Requal determines whether two references point to the same object, region or attribute.
*
* @param ref1_ptr
@@ -11064,7 +12352,7 @@ public class H5 implements java.io.Serializable {
* @return true if equal, else false
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11074,6 +12362,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rcopy creates a copy of an existing reference.
*
* @param src_ref_ptr
@@ -11082,7 +12372,7 @@ public class H5 implements java.io.Serializable {
* @return a valid copy of the reference (byte[]) if successful.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11092,6 +12382,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Ropen_object opens that object and returns an identifier.
* The object opened with this function should be closed when it is no longer needed
* so that resource leaks will not develop. Use the appropriate close function such
@@ -11111,7 +12403,7 @@ public class H5 implements java.io.Serializable {
* @return a valid identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11133,6 +12425,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Ropen region creates a copy of the dataspace of the dataset pointed to by a region reference,
* ref ptr, and defines a selection matching the selection pointed to by ref ptr within the dataspace
* copy. Use H5Sclose to release the dataspace identifier returned by this function when the identifier is
@@ -11152,7 +12446,7 @@ public class H5 implements java.io.Serializable {
* @return a valid dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11174,6 +12468,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Ropen_attr opens the attribute attached to the object and returns an identifier.
* The attribute opened with this function should be closed with H5Aclose when it is no longer needed
* so that resource leaks will not develop.
@@ -11192,7 +12488,7 @@ public class H5 implements java.io.Serializable {
* @return a valid attribute identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -11213,9 +12509,9 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Ropen_attr(byte[] ref_ptr, long rapl_id, long aapl_id)
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
- // Get type //
-
/**
+ * @ingroup JH5R
+ *
* H5Rget obj type3 retrieves the type of the referenced object pointed to.
*
* @param ref_ptr
@@ -11228,7 +12524,7 @@ public class H5 implements java.io.Serializable {
* @return Returns the object type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* array is null.
* @exception IllegalArgumentException
@@ -11238,6 +12534,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rget_file_name retrieves the file name for the object, region or attribute reference pointed to.
*
* @param ref_ptr
@@ -11246,7 +12544,7 @@ public class H5 implements java.io.Serializable {
* @return Returns the file name of the reference
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* array is null.
* @exception IllegalArgumentException
@@ -11256,6 +12554,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rget_obj_name retrieves the object name for the object, region or attribute reference pointed to.
*
* @param ref_ptr
@@ -11268,7 +12568,7 @@ public class H5 implements java.io.Serializable {
* @return Returns the object name of the reference
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* array is null.
* @exception IllegalArgumentException
@@ -11278,6 +12578,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5R
+ *
* H5Rget_attr_name retrieves the attribute name for the object, region or attribute reference pointed to.
*
* @param ref_ptr
@@ -11286,7 +12588,7 @@ public class H5 implements java.io.Serializable {
* @return Returns the attribute name of the reference
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* array is null.
* @exception IllegalArgumentException
@@ -11297,218 +12599,26 @@ public class H5 implements java.io.Serializable {
// ////////////////////////////////////////////////////////////
// //
- // H5R: HDF5 1.8 Reference API Functions //
+ // H5S: Dataspace Interface Functions //
// //
// ////////////////////////////////////////////////////////////
-
- private synchronized static native int H5Rcreate(byte[] ref, long loc_id, String name, int ref_type,
- long space_id)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
-
- /**
- * H5Rcreate creates the reference, ref, of the type specified in ref_type, pointing to the object name
- * located at loc_id.
- *
- * @param loc_id
- * IN: Location identifier used to locate the object being pointed to.
- * @param name
- * IN: Name of object at location loc_id.
- * @param ref_type
- * IN: Type of reference.
- * @param space_id
- * IN: Dataspace identifier with selection.
- *
- * @return the reference (byte[]) if successful
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * an input array is null.
- * @exception IllegalArgumentException
- * an input array is invalid.
- **/
- public synchronized static byte[] H5Rcreate(long loc_id, String name, int ref_type, long space_id)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException
- {
- /* These sizes are correct for HDF5.1.2 */
- int ref_size = 8;
- if (ref_type == HDF5Constants.H5R_DATASET_REGION) {
- ref_size = 12;
- }
- byte rbuf[] = new byte[ref_size];
-
- /* will raise an exception if fails */
- H5Rcreate(rbuf, loc_id, name, ref_type, space_id);
-
- return rbuf;
- }
-
- /**
- * Given a reference to some object, H5Rdereference opens that object and return an identifier.
- *
- * @param dataset
- * IN: Dataset containing reference object.
- * @param access_list
- * IN: Property list of the object being referenced.
- * @param ref_type
- * IN: The reference type of ref.
- * @param ref
- * IN: reference to an object
- *
- * @return valid identifier if successful
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * output array is null.
- * @exception IllegalArgumentException
- * output array is invalid.
- **/
- public static long H5Rdereference(long dataset, long access_list, int ref_type, byte[] ref)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException
- {
- long id = _H5Rdereference(dataset, access_list, ref_type, ref);
- if (id > 0) {
- log.trace("OPEN_IDS: H5Rdereference add {}", id);
- OPEN_IDS.add(id);
- log.trace("OPEN_IDS: {}", OPEN_IDS.size());
- }
- return id;
- }
-
- private synchronized static native long _H5Rdereference(long dataset, long access_list, int ref_type,
- byte[] ref)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
-
- /**
- * H5Rget_name retrieves a name for the object identified by ref.
- *
- * @param loc_id
- * IN: Identifier for the dataset containing the reference or for the group that dataset is in.
- * @param ref_type
- * IN: Type of reference.
- * @param ref
- * IN: An object or dataset region reference.
- * @param name
- * OUT: A name associated with the referenced object or dataset region.
- * @param size
- * IN: The size of the name buffer.
- *
- * @return Returns the length of the name if successful, returning 0 (zero) if no name is associated with
- * the identifier. Otherwise returns a negative value.
- *
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * size is null.
- * @exception IllegalArgumentException
- * Argument is illegal.
- *
- **/
- public synchronized static native long H5Rget_name(long loc_id, int ref_type, byte[] ref, String[] name,
- long size)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
-
- /**
- * H5Rget_name_string retrieves a name for the object identified by ref.
- *
- * @param loc_id
- * IN: Identifier for the dataset containing the reference or for the group that dataset is in.
- * @param ref_type
- * IN: Type of reference.
- * @param ref
- * IN: An object or dataset region reference.
- *
- * @return Returns the name if successful, returning null if no name is associated with
- * the identifier.
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * size is null.
- * @exception IllegalArgumentException
- * Argument is illegal.
- **/
- public synchronized static native String H5Rget_name_string(long loc_id, int ref_type, byte[] ref)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
-
/**
- * H5Rget_obj_type Given a reference to an object ref, H5Rget_obj_type returns the type of the object
- * pointed to.
- *
- * @param loc_id
- * IN: loc_id of the reference object.
- * @param ref_type
- * IN: Type of reference to query.
- * @param ref
- * IN: the reference
+ * @defgroup JH5S Java Dataspace (H5S) Interface
*
- * @return Returns the object type
+ * @see H5S, C-API
*
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * array is null.
- * @exception IllegalArgumentException
- * array is invalid.
+ * @see @ref H5S_UG, User Guide
**/
- public synchronized static native int H5Rget_obj_type(long loc_id, int ref_type, byte ref[])
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
- * H5Rget_obj_type2 Retrieves the type of object that an object reference points to.
- *
- * @see public static int H5Rget_obj_type(int loc_id, int ref_type, byte ref[])
+ * @defgroup JH5S Java Dataspace (H5S) Interface
**/
- private synchronized static native int H5Rget_obj_type2(long loc_id, int ref_type, byte ref[],
- int[] obj_type)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
-
- /**
- * Given a reference to an object ref, H5Rget_region creates a copy of the dataspace of the dataset
- * pointed to and defines a selection in the copy which is the region pointed to.
- *
- * @param loc_id
- * IN: loc_id of the reference object.
- * @param ref_type
- * IN: The reference type of ref.
- * @param ref
- * OUT: the reference to the object and region
- *
- * @return a valid identifier if successful
- *
- * @exception HDF5LibraryException
- * Error from the HDF-5 Library.
- * @exception NullPointerException
- * output array is null.
- * @exception IllegalArgumentException
- * output array is invalid.
- **/
- public static long H5Rget_region(long loc_id, int ref_type, byte[] ref)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException
- {
- long id = _H5Rget_region(loc_id, ref_type, ref);
- if (id > 0) {
- log.trace("OPEN_IDS: H5Rget_region add {}", id);
- OPEN_IDS.add(id);
- log.trace("OPEN_IDS: {}", OPEN_IDS.size());
- }
- return id;
- }
-
- private synchronized static native long _H5Rget_region(long loc_id, int ref_type, byte[] ref)
- throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
-
- // ////////////////////////////////////////////////////////////
- // //
- // H5S: Dataspace Interface Functions //
- // //
- // ////////////////////////////////////////////////////////////
/**************** Operations on dataspaces ********************/
/**
+ * @ingroup JH5S
+ *
* H5Screate creates a new dataspace of a particular type.
*
* @param type
@@ -11517,7 +12627,7 @@ public class H5 implements java.io.Serializable {
* @return a dataspace identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Screate(int type) throws HDF5LibraryException
{
@@ -11533,6 +12643,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Screate(int type) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Screate_simple creates a new simple data space and opens it for access.
*
* @param rank
@@ -11545,7 +12657,7 @@ public class H5 implements java.io.Serializable {
* @return a dataspace identifier
*
* @exception HDF5Exception
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dims or maxdims is null.
**/
@@ -11565,6 +12677,8 @@ public class H5 implements java.io.Serializable {
throws HDF5Exception, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sset_extent_simple sets or resets the size of an existing dataspace.
*
* @param space_id
@@ -11579,13 +12693,15 @@ public class H5 implements java.io.Serializable {
* @return a dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Sset_extent_simple(long space_id, int rank, long[] current_size,
long[] maximum_size)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sset_extent_simple sets or resets the size of an existing dataspace.
*
* @param space_id
@@ -11600,7 +12716,7 @@ public class H5 implements java.io.Serializable {
* @return a dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static long H5Sset_extent_simple(long space_id, int rank, byte[] current_size,
byte[] maximum_size)
@@ -11615,6 +12731,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5S
+ *
* H5Scopy creates a new dataspace which is an exact copy of the dataspace identified by space_id.
*
* @param space_id
@@ -11622,7 +12740,7 @@ public class H5 implements java.io.Serializable {
* @return a dataspace identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Scopy(long space_id) throws HDF5LibraryException
{
@@ -11638,6 +12756,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Scopy(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sclose releases a dataspace.
*
* @param space_id
@@ -11646,7 +12766,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Sclose(long space_id) throws HDF5LibraryException
{
@@ -11662,6 +12782,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Sclose(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sencode converts a data space description into binary form in a buffer.
*
* @param obj_id
@@ -11670,12 +12792,14 @@ public class H5 implements java.io.Serializable {
* @return the buffer for the object to be encoded into.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native byte[] H5Sencode(long obj_id)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sdecode reconstructs the HDF5 data space object and returns a new object handle for it.
*
* @param buf
@@ -11684,7 +12808,7 @@ public class H5 implements java.io.Serializable {
* @return a new object handle
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -11692,19 +12816,24 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_simple_extent_npoints determines the number of elements in a dataspace.
*
* @param space_id
* ID of the dataspace object to query
+ *
* @return the number of elements in the dataspace if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Sget_simple_extent_npoints(long space_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_simple_extent_ndims determines the dimensionality (or rank) of a dataspace.
*
* @param space_id
@@ -11713,12 +12842,14 @@ public class H5 implements java.io.Serializable {
* @return the number of dimensions in the dataspace if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Sget_simple_extent_ndims(long space_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_simple_extent_dims returns the size and maximum sizes of each dimension of a dataspace through
* the dims and maxdims parameters.
*
@@ -11732,7 +12863,7 @@ public class H5 implements java.io.Serializable {
* @return the number of dimensions in the dataspace if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dims or maxdims is null.
**/
@@ -11741,6 +12872,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sis_simple determines whether a dataspace is a simple dataspace.
*
* @param space_id
@@ -11749,11 +12882,13 @@ public class H5 implements java.io.Serializable {
* @return true if is a simple dataspace
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Sis_simple(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_simple_extent_type queries a dataspace to determine the current class of a dataspace.
*
* @param space_id
@@ -11762,12 +12897,14 @@ public class H5 implements java.io.Serializable {
* @return a dataspace class name if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Sget_simple_extent_type(long space_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sset_extent_none removes the extent from a dataspace and sets the type to H5S_NONE.
*
* @param space_id
@@ -11776,11 +12913,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Sset_extent_none(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sextent_copy copies the extent from source_space_id to dest_space_id. This action may change the type
* of the dataspace.
*
@@ -11792,12 +12931,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Sextent_copy(long dest_space_id, long source_space_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sextent_equal determines whether the dataspace extents of two dataspaces, space1_id and space2_id,
* are equal.
*
@@ -11809,7 +12950,7 @@ public class H5 implements java.io.Serializable {
* @return true if successful, else false
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Sextent_equal(long first_space_id, long second_space_id)
throws HDF5LibraryException;
@@ -11817,6 +12958,8 @@ public class H5 implements java.io.Serializable {
/***************** Operations on dataspace selections *****************/
/**
+ * @ingroup JH5S
+ *
* H5Sget_select_type retrieves the type of selection currently defined for the dataspace space_id.
*
* @param space_id
@@ -11825,11 +12968,13 @@ public class H5 implements java.io.Serializable {
* @return the dataspace selection type if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Sget_select_type(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_select_npoints determines the number of elements in the current selection of a dataspace.
*
* @param space_id
@@ -11838,11 +12983,13 @@ public class H5 implements java.io.Serializable {
* @return the number of elements in the selection if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Sget_select_npoints(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_copy copies all the selection information (including offset) from the source
* dataspace to the destination dataspace.
*
@@ -11852,12 +12999,14 @@ public class H5 implements java.io.Serializable {
* ID of the source dataspace
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Sselect_copy(long dst_id, long src_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_valid verifies that the selection for the dataspace.
*
* @param space_id
@@ -11866,11 +13015,13 @@ public class H5 implements java.io.Serializable {
* @return true if the selection is contained within the extent and FALSE if it is not or is an error.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Sselect_valid(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_adjust moves a selection by subtracting an offset from it.
*
* @param space_id
@@ -11879,7 +13030,7 @@ public class H5 implements java.io.Serializable {
* Offset to subtract
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* offset is null.
**/
@@ -11887,8 +13038,10 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_select_bounds retrieves the coordinates of the bounding box containing the current selection and
- * places them into user-supplied buffers. <P> The start and end buffers must be large enough to hold the
+ * places them into user-supplied buffers. <p> The start and end buffers must be large enough to hold the
* dataspace rank number of coordinates.
*
* @param space_id
@@ -11901,7 +13054,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful,with start and end initialized.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* start or end is null.
**/
@@ -11909,25 +13062,29 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_shape_same checks to see if the current selection in the dataspaces are the same
* dimensionality and shape.
* This is primarily used for reading the entire selection in one swoop.
*
- * @param space1_id
+ * @param space1_id
* ID of 1st Dataspace pointer to compare
- * @param space2_id
+ * @param space2_id
* ID of 2nd Dataspace pointer to compare
*
* @return true if the selection is the same dimensionality and shape;
* false otherwise
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Sselect_shape_same(long space1_id, long space2_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_intersect_block checks to see if the current selection in the
* dataspace intersects with the block given.
*
@@ -11942,7 +13099,7 @@ public class H5 implements java.io.Serializable {
* FALSE otherwise
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* offset is null.
**/
@@ -11951,6 +13108,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Soffset_simple sets the offset of a simple dataspace space_id.
*
* @param space_id
@@ -11961,7 +13120,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* offset array is null.
**/
@@ -11969,6 +13128,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Soffset_simple sets the offset of a simple dataspace space_id.
*
* @param space_id
@@ -11979,7 +13140,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* offset array is null.
**/
@@ -12000,6 +13161,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5S
+ *
* H5Sselect_all selects the entire extent of the dataspace space_id.
*
* @param space_id
@@ -12008,23 +13171,28 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Sselect_all(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_none resets the selection region for the dataspace space_id to include no elements.
*
* @param space_id
* IN: The identifier of the dataspace to be reset.
+ *
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Sselect_none(long space_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_elements selects array elements to be included in the selection for the space_id dataspace.
*
* @param space_id
@@ -12039,13 +13207,15 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
private synchronized static native int H5Sselect_elements(long space_id, int op, int num_elements,
byte[] coord)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_elements selects array elements to be included in the selection for the space_id dataspace.
*
* @param space_id
@@ -12062,7 +13232,7 @@ public class H5 implements java.io.Serializable {
* @exception HDF5Exception
* Error in the data conversion
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* cord array is
**/
@@ -12084,6 +13254,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5S
+ *
* H5Sget_select_elem_npoints returns the number of element points in the current dataspace selection.
*
* @param spaceid
@@ -12092,12 +13264,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Sget_select_elem_npoints(long spaceid)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_select_elem_pointlist returns an array of of element points in the current dataspace selection.
* The point coordinates have the same dimensionality (rank) as the dataspace they are located within, one
* coordinate per point.
@@ -12114,7 +13288,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -12123,6 +13297,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_hyperslab selects a hyperslab region to add to the current selected region for the dataspace
* specified by space_id. The start, stride, count, and block arrays must be the same size as the rank of
* the dataspace.
@@ -12143,7 +13319,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -12166,6 +13342,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5S
+ *
* H5Sselect_hyperslab selects a hyperslab region to add to the current selected region for the dataspace
* specified by space_id. The start, stride, count, and block arrays must be the same size as the rank of
* the dataspace.
@@ -12186,7 +13364,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -12197,6 +13375,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5S
+ *
* H5Scombine_hyperslab combines a hyperslab selection with the current selection for a dataspace,
* creating a new dataspace to return the generated selection.
* If the current selection is not a hyperslab, it is freed and the hyperslab
@@ -12220,7 +13400,7 @@ public class H5 implements java.io.Serializable {
* @return a dataspace ID on success / H5I_INVALID_HID on failure
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an input array is null.
* @exception IllegalArgumentException
@@ -12231,8 +13411,10 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5S
+ *
* H5Smodify_select refine an existing hyperslab selection with an operation, using a second
- * hyperslab. The first selection is modified to contain the result of
+ * hyperslab. The first selection is modified to contain the result of
* space1 operated on by space2.
*
* @param space1_id
@@ -12243,12 +13425,14 @@ public class H5 implements java.io.Serializable {
* ID of the source dataspace
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Smodify_select(long space1_id, int op, long space2_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Scombine_select combines two existing hyperslab selections with an operation, returning
* a new dataspace with the resulting selection. The dataspace extent from
* space1 is copied for the dataspace extent of the newly created dataspace.
@@ -12263,12 +13447,14 @@ public class H5 implements java.io.Serializable {
* @return a dataspace ID on success / H5I_INVALID_HID on failure
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Scombine_select(long space1_id, int op, long space2_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sis_regular_hyperslab retrieves a regular hyperslab selection for the dataspace specified
* by space_id.
*
@@ -12278,12 +13464,14 @@ public class H5 implements java.io.Serializable {
* @return a TRUE/FALSE for hyperslab selection if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Sis_regular_hyperslab(long space_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_regular_hyperslab determines if a hyperslab selection is regular for the dataspace specified
* by space_id. The start, stride, count, and block arrays must be the same size as the rank of the
* dataspace.
@@ -12300,7 +13488,7 @@ public class H5 implements java.io.Serializable {
* OUT: Size of block in hyperslab.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* an output array is null.
* @exception IllegalArgumentException
@@ -12311,6 +13499,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_select_hyper_nblocks returns the number of hyperslab blocks in the current dataspace selection.
*
* @param spaceid
@@ -12319,12 +13509,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Sget_select_hyper_nblocks(long spaceid)
throws HDF5LibraryException;
/**
+ * @ingroup JH5S
+ *
* H5Sget_select_hyper_blocklist returns an array of hyperslab blocks. The block coordinates have the same
* dimensionality (rank) as the dataspace they are located within. The list of blocks is formatted as
* follows:
@@ -12350,7 +13542,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -12359,23 +13551,25 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5S
+ *
* H5Sselect_project_intersection projects the intersection of the selections of src_space_id and
* src_intersect_space_id within the selection of src_space_id as a
* selection within the selection of dst_space_id.
*
* @param src_space_id
- * Selection that is mapped to dst_space_id, and intersected with src_intersect_space_id
+ * Selection that is mapped to dst_space_id, and intersected with src_intersect_space_id
* @param dst_space_id
- * Selection that is mapped to src_space_id
+ * Selection that is mapped to src_space_id
* @param src_intersect_space_id
- * Selection whose intersection with src_space_id is projected to dst_space_id to obtain the
- * result
+ * Selection whose intersection with src_space_id is projected to dst_space_id to obtain the
+ * result
*
* @return a dataspace with a selection equal to the intersection of
* src_intersect_space_id and src_space_id projected from src_space to dst_space on success
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long
H5Sselect_project_intersection(long src_space_id, long dst_space_id, long src_intersect_space_id)
@@ -12398,8 +13592,21 @@ public class H5 implements java.io.Serializable {
// H5T: Datatype Interface Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5T Java Datatype (H5T) Interface
+ *
+ * @see H5T, C-API
+ *
+ * @see @ref H5T_UG, User Guide
+ **/
/**
+ * @defgroup JH5T Java Datatype (H5T) Interface
+ **/
+
+ /**
+ * @ingroup JH5T
+ *
* H5Tarray_create creates a new array datatype object.
*
* @param base_id
@@ -12412,7 +13619,7 @@ public class H5 implements java.io.Serializable {
* @return a valid datatype identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dim is null.
**/
@@ -12432,6 +13639,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tclose releases a datatype.
*
* @param type_id
@@ -12440,7 +13649,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Tclose(long type_id) throws HDF5LibraryException
{
@@ -12456,6 +13665,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native int _H5Tclose(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tcommit saves a transient datatype as an immutable named datatype in a file.
*
* @param loc_id
@@ -12472,7 +13683,7 @@ public class H5 implements java.io.Serializable {
* IN: Datatype access property list.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -12481,6 +13692,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tcommit_anon commits a transient datatype (not immutable) to a file, turning it into a named datatype
* with the specified creation and property lists.
*
@@ -12494,12 +13707,14 @@ public class H5 implements java.io.Serializable {
* IN: Datatype access property list.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tcommit_anon(long loc_id, long type_id, long tcpl_id,
long tapl_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tcommitted queries a type to determine whether the type specified by the type identifier is a named
* type or a transient type.
*
@@ -12509,11 +13724,13 @@ public class H5 implements java.io.Serializable {
* @return true the datatype has been committed
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Tcommitted(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tcompiler_conv finds out whether the library's conversion function from type src_id to type dst_id is
* a compiler (hard) conversion.
*
@@ -12523,13 +13740,15 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of destination datatype.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tcompiler_conv(long src_id, long dst_id)
throws HDF5LibraryException;
/**
- ** H5Tconvert converts nelmts elements from the type specified by the src_id identifier to type dst_id.
+ * @ingroup JH5T
+ *
+ * H5Tconvert converts nelmts elements from the type specified by the src_id identifier to type dst_id.
*
* @param src_id
* IN: Identifier of source datatype.
@@ -12545,7 +13764,7 @@ public class H5 implements java.io.Serializable {
* IN: Dataset transfer property list identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -12556,6 +13775,8 @@ public class H5 implements java.io.Serializable {
// int H5Tconvert(int src_id, int dst_id, long nelmts, Pointer buf, Pointer background, int plist_id);
/**
+ * @ingroup JH5T
+ *
* H5Tcopy copies an existing datatype. The returned type is always transient and unlocked.
*
* @param type_id
@@ -12565,7 +13786,7 @@ public class H5 implements java.io.Serializable {
* @return a datatype identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tcopy(long type_id) throws HDF5LibraryException
{
@@ -12581,6 +13802,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Tcopy(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tcreate creates a new dataype of the specified class with the specified number of bytes.
*
* @param tclass
@@ -12591,7 +13814,7 @@ public class H5 implements java.io.Serializable {
* @return datatype identifier
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tcreate(int tclass, long size) throws HDF5LibraryException
{
@@ -12607,6 +13830,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Tcreate(int type, long size) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tdecode reconstructs the HDF5 data type object and returns a new object handle for it.
*
* @param buf
@@ -12615,7 +13840,7 @@ public class H5 implements java.io.Serializable {
* @return a new object handle
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -12634,6 +13859,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tdetect_class determines whether the datatype specified in dtype_id contains any datatypes of the
* datatype class specified in dtype_class.
*
@@ -12645,12 +13872,14 @@ public class H5 implements java.io.Serializable {
* @return true if the datatype specified in dtype_id contains any datatypes of the datatype class
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Tdetect_class(long type_id, int cls)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tencode converts a data type description into binary form in a buffer.
*
* @param obj_id
@@ -12664,7 +13893,7 @@ public class H5 implements java.io.Serializable {
* @return the size needed for the allocated buffer.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -12672,6 +13901,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
// /**
+ // * @ingroup JH5T
+ // *
// * H5Tencode converts a data type description into binary form in a buffer.
// *
// * @param obj_id
@@ -12680,12 +13911,14 @@ public class H5 implements java.io.Serializable {
// * @return the buffer for the object to be encoded into.
// *
// * @exception HDF5LibraryException
- // * Error from the HDF-5 Library.
+ // * Error from the HDF5 Library.
// **/
// public synchronized static native byte[] H5Tencode(int obj_id)
- // throws HDF5LibraryException;
+ // throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tenum_create creates a new enumeration datatype based on the specified base datatype, parent_id,
* which must be an integer type.
*
@@ -12695,7 +13928,7 @@ public class H5 implements java.io.Serializable {
* @return the datatype identifier for the new enumeration datatype
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tenum_create(long base_id) throws HDF5LibraryException
{
@@ -12711,6 +13944,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Tenum_create(long base_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tenum_insert inserts a new enumeration datatype member into an enumeration datatype.
*
* @param type
@@ -12721,7 +13956,7 @@ public class H5 implements java.io.Serializable {
* IN: The value of the member, data of the correct type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -12729,6 +13964,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tenum_insert inserts a new enumeration datatype member into an enumeration datatype.
*
* @param type
@@ -12741,7 +13978,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -12752,6 +13989,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tenum_insert inserts a new enumeration datatype member into an enumeration datatype.
*
* @param type
@@ -12764,7 +14003,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -12779,6 +14018,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tenum_nameof finds the symbol name that corresponds to the specified value of the enumeration
* datatype type.
*
@@ -12792,7 +14033,7 @@ public class H5 implements java.io.Serializable {
* @return the symbol name.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* value is null.
**/
@@ -12802,6 +14043,8 @@ public class H5 implements java.io.Serializable {
// int H5Tenum_nameof(int type, Pointer value, Buffer name/* out */, long size);
/**
+ * @ingroup JH5T
+ *
* H5Tenum_nameof finds the symbol name that corresponds to the specified value of the enumeration
* datatype type.
*
@@ -12817,7 +14060,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -12831,6 +14074,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tenum_valueof finds the value that corresponds to the specified name of the enumeration datatype
* type.
*
@@ -12842,12 +14087,14 @@ public class H5 implements java.io.Serializable {
* OUT: The value of the member
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tenum_valueof(long type, String name, byte[] value)
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tenum_valueof finds the value that corresponds to the specified name of the enumeration datatype
* type.
*
@@ -12861,7 +14108,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -12875,6 +14122,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tequal determines whether two datatype identifiers refer to the same datatype.
*
* @param type_id1
@@ -12885,12 +14134,14 @@ public class H5 implements java.io.Serializable {
* @return true if the datatype identifiers refer to the same datatype, else false.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Tequal(long type_id1, long type_id2)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_array_dims returns the sizes of the dimensions of the specified array datatype object.
*
* @param type_id
@@ -12901,7 +14152,7 @@ public class H5 implements java.io.Serializable {
* @return the non-negative number of dimensions of the array type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dims is null.
**/
@@ -12912,6 +14163,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tget_array_dims2 returns the sizes of the dimensions of the specified array datatype object.
*
* @param type_id
@@ -12922,7 +14175,7 @@ public class H5 implements java.io.Serializable {
* @return the non-negative number of dimensions of the array type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* dims is null.
**/
@@ -12930,6 +14183,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_array_ndims returns the rank, the number of dimensions, of an array datatype object.
*
* @param type_id
@@ -12938,11 +14193,13 @@ public class H5 implements java.io.Serializable {
* @return the rank of the array
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_array_ndims(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_class returns the datatype class identifier.
*
* @param type_id
@@ -12951,11 +14208,13 @@ public class H5 implements java.io.Serializable {
* @return datatype class identifier if successful; otherwise H5T_NO_CLASS(-1).
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_class(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_class_name returns the datatype class identifier.
*
* @param class_id
@@ -12996,6 +14255,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tget_create_plist returns a property list identifier for the datatype creation property list
* associated with the datatype specified by type_id.
*
@@ -13005,7 +14266,7 @@ public class H5 implements java.io.Serializable {
* @return a datatype property list identifier.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tget_create_plist(long type_id) throws HDF5LibraryException
{
@@ -13021,6 +14282,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Tget_create_plist(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_cset retrieves the character set type of a string datatype.
*
* @param type_id
@@ -13029,11 +14292,13 @@ public class H5 implements java.io.Serializable {
* @return a valid character set type if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_cset(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_cset the character set to be used.
*
* @param type_id
@@ -13044,11 +14309,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_cset(long type_id, int cset) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_ebias retrieves the exponent bias of a floating-point type.
*
* @param type_id
@@ -13057,11 +14324,13 @@ public class H5 implements java.io.Serializable {
* @return the bias if successful; otherwise 0.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_ebias(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_ebias sets the exponent bias of a floating-point type.
*
* @param type_id
@@ -13072,7 +14341,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Tset_ebias(long type_id, int ebias) throws HDF5LibraryException
{
@@ -13081,6 +14350,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tget_ebias retrieves the exponent bias of a floating-point type.
*
* @param type_id
@@ -13089,11 +14360,13 @@ public class H5 implements java.io.Serializable {
* @return the bias
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Tget_ebias_long(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_ebias sets the exponent bias of a floating-point type.
*
* @param type_id
@@ -13102,11 +14375,13 @@ public class H5 implements java.io.Serializable {
* IN: Exponent bias value.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tset_ebias(long type_id, long ebias) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_fields retrieves information about the locations of the various bit fields of a floating point
* datatype.
*
@@ -13123,7 +14398,7 @@ public class H5 implements java.io.Serializable {
* </ul>
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* fields is null.
* @exception IllegalArgumentException
@@ -13133,6 +14408,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_fields retrieves information about the locations of the various bit fields of a floating point
* datatype.
*
@@ -13141,7 +14418,7 @@ public class H5 implements java.io.Serializable {
* @param fields
* OUT: location of size and bit-position.
*
- * <pre>
+ * <pre>
* fields[0] = spos OUT: location to return size of in bits.
* fields[1] = epos OUT: location to return exponent bit-position.
* fields[2] = esize OUT: location to return size of exponent in bits.
@@ -13152,7 +14429,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* fields is null.
* @exception IllegalArgumentException
@@ -13168,6 +14445,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException, IllegalArgumentException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_fields sets the locations and sizes of the various floating point bit fields.
*
* @param type_id
@@ -13184,12 +14463,14 @@ public class H5 implements java.io.Serializable {
* IN: Size of mantissa in bits.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tset_fields(long type_id, long spos, long epos, long esize,
long mpos, long msize) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_fields sets the locations and sizes of the various floating point bit fields.
*
* @param type_id
@@ -13208,7 +14489,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Tset_fields(long type_id, int spos, int epos, int esize, int mpos, int msize)
throws HDF5LibraryException
@@ -13218,6 +14499,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tget_inpad retrieves the internal padding type for unused bits in floating-point datatypes.
*
* @param type_id
@@ -13226,11 +14509,13 @@ public class H5 implements java.io.Serializable {
* @return a valid padding type if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_inpad(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* 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 H5Tset_inpad will be filled according to the value of
* the padding value property inpad.
@@ -13243,11 +14528,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_inpad(long type_id, int inpad) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_member_class returns the class of datatype of the specified member.
*
* @param type_id
@@ -13258,12 +14545,14 @@ public class H5 implements java.io.Serializable {
* @return the class of the datatype of the field if successful;
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_member_class(long type_id, int membno)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_member_index retrieves the index of a field of a compound datatype.
*
* @param type_id
@@ -13274,12 +14563,14 @@ public class H5 implements java.io.Serializable {
* @return if field is defined, the index; else negative.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_member_index(long type_id, String field_name)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_member_name retrieves the name of a field of a compound datatype or an element of an enumeration
* datatype.
*
@@ -13291,14 +14582,16 @@ public class H5 implements java.io.Serializable {
* @return a valid pointer to the name if successful; otherwise null.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Tget_member_name(long type_id, int field_idx)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_member_offset returns the byte offset of the specified member of the compound datatype. This is
- * the byte offset in the HDF-5 file/library, NOT the offset of any Java object which might be mapped to
+ * the byte offset in the HDF5 file/library, NOT the offset of any Java object which might be mapped to
* this data item.
*
* @param type_id
@@ -13311,6 +14604,8 @@ public class H5 implements java.io.Serializable {
public synchronized static native long H5Tget_member_offset(long type_id, int membno);
/**
+ * @ingroup JH5T
+ *
* H5Tget_member_type returns the datatype of the specified member.
*
* @param type_id
@@ -13321,7 +14616,7 @@ public class H5 implements java.io.Serializable {
* @return the identifier of a copy of the datatype of the field if successful;
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tget_member_type(long type_id, int field_idx) throws HDF5LibraryException
{
@@ -13338,6 +14633,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_member_value returns the value of the enumeration datatype member memb_no.
*
* @param type_id
@@ -13348,7 +14645,7 @@ public class H5 implements java.io.Serializable {
* OUT: The value of the member
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* value is null.
**/
@@ -13356,6 +14653,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_member_value returns the value of the enumeration datatype member memb_no.
*
* @param type_id
@@ -13368,7 +14667,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* value is null.
**/
@@ -13382,6 +14681,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_native_type returns the equivalent native datatype for the datatype specified in type_id.
*
* @param type_id
@@ -13391,7 +14692,7 @@ public class H5 implements java.io.Serializable {
* @return the native datatype identifier for the specified dataset datatype.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static long H5Tget_native_type(long type_id) throws HDF5LibraryException
{
@@ -13399,6 +14700,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tget_native_type returns the equivalent native datatype for the datatype specified in type_id.
*
* @param type_id
@@ -13409,7 +14712,7 @@ public class H5 implements java.io.Serializable {
* @return the native datatype identifier for the specified dataset datatype.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tget_native_type(long type_id, int direction) throws HDF5LibraryException
{
@@ -13426,6 +14729,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_nmembers retrieves the number of fields a compound datatype has.
*
* @param type_id
@@ -13434,11 +14739,13 @@ public class H5 implements java.io.Serializable {
* @return number of members datatype has if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_nmembers(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_norm retrieves the mantissa normalization of a floating-point datatype.
*
* @param type_id
@@ -13447,11 +14754,13 @@ public class H5 implements java.io.Serializable {
* @return a valid normalization type if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_norm(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_norm sets the mantissa normalization of a floating-point datatype.
*
* @param type_id
@@ -13462,11 +14771,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_norm(long type_id, int norm) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_offset retrieves the bit offset of the first significant bit.
*
* @param type_id
@@ -13475,11 +14786,13 @@ public class H5 implements java.io.Serializable {
* @return a positive offset value if successful; otherwise 0.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_offset(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_offset sets the bit offset of the first significant bit.
*
* @param type_id
@@ -13490,7 +14803,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Tset_offset(long type_id, int offset) throws HDF5LibraryException
{
@@ -13499,6 +14812,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tset_offset sets the bit offset of the first significant bit.
*
* @param type_id
@@ -13507,12 +14822,14 @@ public class H5 implements java.io.Serializable {
* IN: Offset of first significant bit.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tset_offset(long type_id, long offset)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_order returns the byte order of an atomic datatype.
*
* @param type_id
@@ -13521,11 +14838,13 @@ public class H5 implements java.io.Serializable {
* @return a byte order constant if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_order(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_order sets the byte ordering of an atomic datatype.
*
* @param type_id
@@ -13536,11 +14855,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_order(long type_id, int order) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_pad retrieves the padding type of the least and most-significant bit padding.
*
* @param type_id
@@ -13556,7 +14877,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* pad is null.
**/
@@ -13564,6 +14885,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_pad sets the least and most-significant bits padding types.
*
* @param type_id
@@ -13576,12 +14899,14 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_pad(long type_id, int lsb, int msb)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_precision returns the precision of an atomic datatype.
*
* @param type_id
@@ -13590,11 +14915,13 @@ public class H5 implements java.io.Serializable {
* @return the number of significant bits if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_precision(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_precision sets the precision of an atomic datatype.
*
* @param type_id
@@ -13605,7 +14932,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static int H5Tset_precision(long type_id, int precision) throws HDF5LibraryException
{
@@ -13614,6 +14941,8 @@ public class H5 implements java.io.Serializable {
}
/**
+ * @ingroup JH5T
+ *
* H5Tget_precision returns the precision of an atomic datatype.
*
* @param type_id
@@ -13622,11 +14951,13 @@ public class H5 implements java.io.Serializable {
* @return the number of significant bits if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Tget_precision_long(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_precision sets the precision of an atomic datatype.
*
* @param type_id
@@ -13635,12 +14966,14 @@ public class H5 implements java.io.Serializable {
* IN: Number of bits of precision for datatype.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tset_precision(long type_id, long precision)
throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_sign retrieves the sign type for an integer type.
*
* @param type_id
@@ -13649,11 +14982,13 @@ public class H5 implements java.io.Serializable {
* @return a valid sign type if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_sign(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_sign sets the sign property for an integer type.
*
* @param type_id
@@ -13664,11 +14999,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_sign(long type_id, int sign) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_size returns the size of a datatype in bytes.
*
* @param type_id
@@ -13677,11 +15014,13 @@ public class H5 implements java.io.Serializable {
* @return the size of the datatype in bytes
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5Tget_size(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_size sets the total size in bytes, size, for an atomic datatype (this operation is not permitted
* on compound datatypes).
*
@@ -13693,11 +15032,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_size(long type_id, long size) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_strpad retrieves the string padding method for a string datatype.
*
* @param type_id
@@ -13706,11 +15047,13 @@ public class H5 implements java.io.Serializable {
* @return a valid string padding type if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tget_strpad(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_strpad defines the storage mechanism for the string.
*
* @param type_id
@@ -13721,11 +15064,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_strpad(long type_id, int strpad) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_super returns the type from which TYPE is derived.
*
* @param type
@@ -13734,7 +15079,7 @@ public class H5 implements java.io.Serializable {
* @return the parent type
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tget_super(long type) throws HDF5LibraryException
{
@@ -13750,6 +15095,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Tget_super(long type) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tget_tag returns the tag associated with datatype type_id.
*
* @param type
@@ -13758,11 +15105,13 @@ public class H5 implements java.io.Serializable {
* @return the tag
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5Tget_tag(long type) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tset_tag tags an opaque datatype type_id with a unique ASCII identifier tag.
*
* @param type
@@ -13773,11 +15122,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tset_tag(long type, String tag) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tinsert adds another member to the compound datatype type_id.
*
* @param type_id
@@ -13792,7 +15143,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -13800,6 +15151,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tis_variable_str determines whether the datatype identified in type_id is a variable-length string.
*
* @param type_id
@@ -13808,11 +15161,13 @@ public class H5 implements java.io.Serializable {
* @return true if type_id is a variable-length string.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5Tis_variable_str(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tlock locks the datatype specified by the type_id identifier, making it read-only and
* non-destrucible.
*
@@ -13822,11 +15177,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tlock(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Topen opens a named datatype at the location specified by loc_id and return an identifier for the
* datatype.
*
@@ -13840,7 +15197,7 @@ public class H5 implements java.io.Serializable {
* @return a named datatype identifier if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* name is null.
**/
@@ -13860,6 +15217,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tpack recursively removes padding from within a compound datatype to make it more efficient
* (space-wise) to store that data. <P> <b>WARNING:</b> This call only affects the C-data, even if it
* succeeds, there may be no visible effect on Java objects.
@@ -13870,11 +15229,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Tpack(long type_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Treclaim reclaims buffer used for VL data.
*
* @param type_id
@@ -13887,7 +15248,7 @@ public class H5 implements java.io.Serializable {
* Buffer with data to be reclaimed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
* @exception NullPointerException
* buf is null.
**/
@@ -13896,6 +15257,8 @@ public class H5 implements java.io.Serializable {
throws HDF5LibraryException, NullPointerException;
/**
+ * @ingroup JH5T
+ *
* H5Tvlen_create creates a new variable-length (VL) dataype.
*
* @param base_id
@@ -13904,7 +15267,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public static long H5Tvlen_create(long base_id) throws HDF5LibraryException
{
@@ -13920,6 +15283,8 @@ public class H5 implements java.io.Serializable {
private synchronized static native long _H5Tvlen_create(long base_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Tflush causes all buffers associated with a committed datatype to be immediately flushed to disk
* without removing the data from the cache.
*
@@ -13927,11 +15292,13 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the committed datatype to be flushed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Tflush(long dtype_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5T
+ *
* H5Trefresh causes all buffers associated with a committed datatype to be cleared and immediately
* re-loaded with updated contents from disk. This function essentially closes the datatype, evicts
* all metadata associated with it from the cache, and then re-opens the datatype. The reopened datatype
@@ -13941,7 +15308,7 @@ public class H5 implements java.io.Serializable {
* IN: Identifier of the committed datatype to be refreshed.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5Trefresh(long dtype_id) throws HDF5LibraryException;
@@ -13962,8 +15329,21 @@ public class H5 implements java.io.Serializable {
// //
// ////////////////////////////////////////////////////////////
- /// VOL Connector Functionality
/**
+ * @defgroup JH5VL Java VOL Connector (H5VL) Interface
+ *
+ * @see H5VL, C-API
+ *
+ * @see @ref H5VL_UG, User Guide
+ **/
+
+ /**
+ * @defgroup JH5VL Java VOL Connector (H5VL) Interface
+ **/
+
+ /**
+ * @ingroup JH5VL
+ *
* H5VLregister_connector_by_name registers a new VOL connector as a member of the virtual object layer
* class.
*
@@ -13976,11 +15356,13 @@ public class H5 implements java.io.Serializable {
* @return a VOL connector ID
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5VLregister_connector_by_name(String connector_name, long vipl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLregister_connector_by_value registers a new VOL connector as a member of the virtual object layer
* class.
*
@@ -13993,11 +15375,13 @@ public class H5 implements java.io.Serializable {
* @return a VOL connector ID
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5VLregister_connector_by_value(int connector_value, long vipl_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLis_connector_registered_by_name tests whether a VOL class has been registered.
*
* @param name
@@ -14006,11 +15390,13 @@ public class H5 implements java.io.Serializable {
* @return true if a VOL connector with that name has been registered
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5VLis_connector_registered_by_name(String name)
throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLis_connector_registered_by_value tests whether a VOL class has been registered.
*
* @param connector_value
@@ -14019,11 +15405,13 @@ public class H5 implements java.io.Serializable {
* @return true if a VOL connector with that value has been registered
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native boolean H5VLis_connector_registered_by_value(int connector_value)
throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLget_connector_id retrieves the ID for a registered VOL connector for a given object.
*
* @param object_id
@@ -14032,10 +15420,12 @@ public class H5 implements java.io.Serializable {
* @return a VOL connector ID
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5VLget_connector_id(long object_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLget_connector_id_by_name retrieves the ID for a registered VOL connector.
*
* @param name
@@ -14044,11 +15434,13 @@ public class H5 implements java.io.Serializable {
* @return a VOL connector ID
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5VLget_connector_id_by_name(String name)
throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLget_connector_id_by_value retrieves the ID for a registered VOL connector.
*
* @param connector_value
@@ -14057,11 +15449,13 @@ public class H5 implements java.io.Serializable {
* @return a VOL connector ID
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native long H5VLget_connector_id_by_value(int connector_value)
throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLget_connector_name returns the connector name for the VOL associated with the
* object or file ID.
*
@@ -14071,28 +15465,32 @@ public class H5 implements java.io.Serializable {
* @return the connector name
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native String H5VLget_connector_name(long object_id)
throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLclose closes a VOL connector ID.
*
* @param connector_id
* IN: Identifier of the connector.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5VLclose(long connector_id) throws HDF5LibraryException;
/**
+ * @ingroup JH5VL
+ *
* H5VLunregister_connector removes a VOL connector ID from the library.
*
* @param connector_id
* IN: Identifier of the connector.
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native void H5VLunregister_connector(long connector_id)
throws HDF5LibraryException;
@@ -14105,8 +15503,17 @@ public class H5 implements java.io.Serializable {
// H5Z: Filter Interface Functions //
// //
// ////////////////////////////////////////////////////////////
+ /**
+ * @defgroup JH5Z Java Filter (H5Z) Interface
+ *
+ * @see H5Z, C-API
+ *
+ * @see @ref H5Z_UG, User Guide
+ **/
/**
+ * @ingroup JH5Z
+ *
* H5Zfilter_avail checks if a filter is available.
*
* @param filter
@@ -14115,11 +15522,13 @@ public class H5 implements java.io.Serializable {
* @return a non-negative(TRUE/FALSE) value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Zfilter_avail(int filter) throws HDF5LibraryException;
/**
+ * @ingroup JH5Z
+ *
* H5Zget_filter_info gets information about a pipeline data filter.
*
* @param filter
@@ -14128,11 +15537,13 @@ public class H5 implements java.io.Serializable {
* @return the filter information flags
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Zget_filter_info(int filter) throws HDF5LibraryException;
/**
+ * @ingroup JH5Z
+ *
* H5Zunregister unregisters a filter.
*
* @param filter
@@ -14141,7 +15552,7 @@ public class H5 implements java.io.Serializable {
* @return a non-negative value if successful
*
* @exception HDF5LibraryException
- * Error from the HDF-5 Library.
+ * Error from the HDF5 Library.
**/
public synchronized static native int H5Zunregister(int filter) throws HDF5LibraryException;
diff --git a/java/src/hdf/hdf5lib/HDF5Constants.java b/java/src/hdf/hdf5lib/HDF5Constants.java
index 5995246..7bd3336 100644
--- a/java/src/hdf/hdf5lib/HDF5Constants.java
+++ b/java/src/hdf/hdf5lib/HDF5Constants.java
@@ -16,14 +16,15 @@ package hdf.hdf5lib;
import hdf.hdf5lib.structs.H5O_token_t;
/**
+ * @page HDF5CONST Constants and Enumerated Types
* This class contains C constants and enumerated types of HDF5 library. The
- * values of these constants are obtained from the library by calling J2C(int
- * jconstant), where jconstant is any of the private constants which start their
- * name with "JH5" need to be converted.
+ * values of these constants are obtained from the library by calling
+ * the JNI function jconstant, where jconstant is used for any of the private constants
+ * which start their name with "H5" need to be converted.
* <P>
* <B>Do not edit this file!</b>
*
- * <b>See also:</b> hdf.hdf5lib.HDF5Library
+ * @see @ref HDF5LIB
*/
public class HDF5Constants {
static { H5.loadH5Lib(); }
@@ -32,8 +33,6 @@ public class HDF5Constants {
// Get the HDF5 constants from the library //
// /////////////////////////////////////////////////////////////////////////
- // public static final long H5_QUARTER_HADDR_MAX = H5_QUARTER_HADDR_MAX();
-
/** Special parameters for szip compression */
public static final int H5_SZIP_MAX_PIXELS_PER_BLOCK = H5_SZIP_MAX_PIXELS_PER_BLOCK();
/** Special parameters for szip compression */
@@ -2014,6 +2013,8 @@ public class HDF5Constants {
private static native final int H5ES_STATUS_FAIL();
+ private static native final int H5ES_STATUS_CANCELED();
+
private static native final int H5F_ACC_CREAT();
private static native final int H5F_ACC_EXCL();
diff --git a/java/src/hdf/hdf5lib/HDF5GroupInfo.java b/java/src/hdf/hdf5lib/HDF5GroupInfo.java
deleted file mode 100644
index 880f003..0000000
--- a/java/src/hdf/hdf5lib/HDF5GroupInfo.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * 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 COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://www.hdfgroup.org/licenses. *
- * If you do not have access to either file, you may request a copy from *
- * help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-package hdf.hdf5lib;
-
-/**
- * <p>
- * This class is a container for the information reported about an HDF5 Object
- * from the H5Gget_obj_info() method.
- * <p>
- * The fileno and objno fields contain four values which uniquely identify an
- * object among those HDF5 files which are open: if all four values are the same
- * between two objects, then the two objects are the same (provided both files
- * are still open). The nlink field is the number of hard links to the object or
- * zero when information is being returned about a symbolic link (symbolic links
- * do not have hard links but all other objects always have at least one). The
- * type field contains the type of the object, one of H5G_GROUP, H5G_DATASET, or
- * H5G_LINK. The mtime field contains the modification time. If information is
- * being returned about a symbolic link then linklen will be the length of the
- * link value (the name of the pointed-to object with the null terminator);
- * otherwise linklen will be zero. Other fields may be added to this structure
- * in the future.
- */
-
-public class HDF5GroupInfo {
- long[] fileno;
- long[] objno;
- int nlink;
- int type;
- long mtime;
- int linklen;
-
- /**
- * Container for the information reported about an HDF5 Object
- * from the H5Gget_obj_info() method
- */
- public HDF5GroupInfo()
- {
- fileno = new long[2];
- objno = new long[2];
- nlink = -1;
- type = -1;
- mtime = 0;
- linklen = 0;
- }
-
- /**
- * Sets the HDF5 group information. Used by the JHI5.
- *
- * @param fn
- * File id number
- * @param on
- * Object id number
- * @param nl
- * Number of links
- * @param t
- * Type of the object
- * @param mt
- * Modification time
- * @param len
- * Length of link
- **/
- public void setGroupInfo(long[] fn, long[] on, int nl, int t, long mt, int len)
- {
- fileno = fn;
- objno = on;
- nlink = nl;
- type = t;
- mtime = mt;
- linklen = len;
- }
-
- /** Resets all the group information to defaults. */
- public void reset()
- {
- fileno[0] = 0;
- fileno[1] = 0;
- objno[0] = 0;
- objno[1] = 0;
- nlink = -1;
- type = -1;
- mtime = 0;
- linklen = 0;
- }
-
- /**
- * fileno accessors
- * @return the file number if successful
- */
- public long[] getFileno() { return fileno; }
-
- /**
- * accessors
- * @return the object number if successful
- */
- public long[] getObjno() { return objno; }
-
- /**
- * accessors
- * @return type of group if successful
- */
- public int getType() { return type; }
-
- /**
- * accessors
- * @return the number of links in the group if successful
- */
- public int getNlink() { return nlink; }
-
- /**
- * accessors
- * @return the modified time value if successful
- */
- public long getMtime() { return mtime; }
-
- /**
- * accessors
- * @return a length of link name if successful
- */
- public int getLinklen() { return linklen; }
-
- /**
- * The fileno and objno fields contain four values which uniquely identify
- * an object among those HDF5 files.
- */
- @Override
- public boolean equals(Object obj)
- {
- if (!(obj instanceof HDF5GroupInfo)) {
- return false;
- }
-
- HDF5GroupInfo target = (HDF5GroupInfo)obj;
- if ((fileno[0] == target.fileno[0]) && (fileno[1] == target.fileno[1]) &&
- (objno[0] == target.objno[0]) && (objno[1] == target.objno[1])) {
- return true;
- }
- else {
- return false;
- }
- }
-
- /**
- * Returns the object id.
- *
- * @return the object id
- */
- public long getOID() { return objno[0]; }
-
- /**
- * Converts this object to a String representation.
- *
- * @return a string representation of this object
- */
- @Override
- public String toString()
- {
- String fileStr = "fileno=null";
- String objStr = "objno=null";
-
- if (fileno != null) {
- fileStr = "fileno[0]=" + fileno[0] + ",fileno[1]=" + fileno[1];
- }
-
- if (objno != null) {
- objStr = "objno[0]=" + objno[0] + ",objno[1]=" + objno[1];
- }
-
- return getClass().getName() + "[" + fileStr + "," + objStr + ",type=" + type + ",nlink=" + nlink +
- ",mtime=" + mtime + ",linklen=" + linklen + "]";
- }
-}
diff --git a/java/src/hdf/hdf5lib/HDFArray.java b/java/src/hdf/hdf5lib/HDFArray.java
index 8525fb0..9ea314d 100644
--- a/java/src/hdf/hdf5lib/HDFArray.java
+++ b/java/src/hdf/hdf5lib/HDFArray.java
@@ -19,14 +19,15 @@ import hdf.hdf5lib.exceptions.HDF5Exception;
import hdf.hdf5lib.exceptions.HDF5JavaException;
/**
+ * @page HDFARRAY Java Array Conversion
* This is a class for handling multidimensional arrays for HDF.
* <p>
* The purpose is to allow the storage and retrieval of arbitrary array types containing scientific data.
* <p>
* The methods support the conversion of an array to and from Java to a one-dimensional array of bytes
- * suitable for I/O by the C library. <p> This class heavily uses the <a
- * href="./hdf.hdf5lib.HDFNativeData.html">HDFNativeData</a> class to convert between Java and C
- * representations.
+ * suitable for I/O by the C library. <p> This class heavily uses the
+ * @ref HDFNATIVE
+ * class to convert between Java and C representations.
*/
public class HDFArray {
diff --git a/java/src/hdf/hdf5lib/HDFNativeData.java b/java/src/hdf/hdf5lib/HDFNativeData.java
index c497043..bc4e866 100644
--- a/java/src/hdf/hdf5lib/HDFNativeData.java
+++ b/java/src/hdf/hdf5lib/HDFNativeData.java
@@ -17,11 +17,12 @@ import hdf.hdf5lib.exceptions.HDF5Exception;
import hdf.hdf5lib.exceptions.HDF5JavaException;
/**
+ * @page HDFNATIVE Native Arrays of Numbers
* This class encapsulates native methods to deal with arrays of numbers,
* converting from numbers to bytes and bytes to numbers.
* <p>
- * These routines are used by class <b>HDFArray</b> to pass data to and from the
- * HDF-5 library.
+ * These routines are used by class @ref HDFARRAY to pass data to and from the
+ * HDF5 library.
* <p>
* Methods xxxToByte() convert a Java array of primitive numbers (int, short,
* ...) to a Java array of bytes. Methods byteToXxx() convert from a Java array
@@ -30,7 +31,7 @@ import hdf.hdf5lib.exceptions.HDF5JavaException;
* Variant interfaces convert a section of an array, and also can convert to
* sub-classes of Java <b>Number</b>.
* <P>
- * <b>See also:</b> hdf.hdf5lib.HDFArray.
+ * @see @ref HDFARRAY.
*/
public class HDFNativeData {
diff --git a/java/src/hdf/hdf5lib/callbacks/Callbacks.java b/java/src/hdf/hdf5lib/callbacks/Callbacks.java
index 86d6193..3d5fbd1 100644
--- a/java/src/hdf/hdf5lib/callbacks/Callbacks.java
+++ b/java/src/hdf/hdf5lib/callbacks/Callbacks.java
@@ -13,6 +13,7 @@
package hdf.hdf5lib.callbacks;
/**
+ * @page CALLBACKS HDF5 Java Callbacks Interface
* All callback definitions must derive from this interface. Any
* derived interfaces must define a single public method named "callback".
* You are responsible for deregistering your callback (if necessary)
@@ -20,11 +21,14 @@ package hdf.hdf5lib.callbacks;
* a callback which has been GC'd, you will likely crash the VM. If
* there is no method to deregister the callback (e.g. <code>atexit</code>
* in the C library), you must ensure that you always keep a live reference
- * to the callback object.<p>
+ * to the callback object.
+ *
* A callback should generally never throw an exception, since it doesn't
* necessarily have an encompassing Java environment to catch it. Any
* exceptions thrown will be passed to the default callback exception
* handler.
+ *
+ * @defgroup JCALL HDF5 Library Java Callbacks
*/
public interface Callbacks {
}
diff --git a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java
index 6c68f36..9958b3b 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java
@@ -20,6 +20,8 @@ import hdf.hdf5lib.structs.H5A_info_t;
*/
public interface H5A_iterate_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each attribute
*
* @param loc_id the ID for the group or dataset being iterated over
diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java b/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java
index cf7ada6..49323a2 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5D_append_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each dataset access property list
*
* @param dataset_id the ID for the dataset being iterated over
diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java
index 54c12e3..5f77998 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5D_iterate_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each dataset element
*
* @param elem the pointer to the element in memory containing the current point
diff --git a/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java b/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java
index 5722195..a8ef5df 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java
@@ -20,6 +20,8 @@ import hdf.hdf5lib.structs.H5E_error2_t;
*/
public interface H5E_walk_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each error stack element
*
* @param nidx the index of the current error stack element
diff --git a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java
index 53635bf..7342e58 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java
@@ -20,6 +20,8 @@ import hdf.hdf5lib.structs.H5L_info_t;
*/
public interface H5L_iterate_t extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each group
*
* @param loc_id the ID for the group being iterated over
diff --git a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java
index ecf868c..bfe8c67 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java
@@ -20,6 +20,8 @@ import hdf.hdf5lib.structs.H5O_info_t;
*/
public interface H5O_iterate_t extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each group
*
* @param loc_id the ID for the group or dataset being iterated over
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java
index 0a09a94..a235861 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_cls_close_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param prop_id the ID for the property list class being iterated over
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java
index 53f86be..b218e0c 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_cls_copy_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param new_prop_id the ID for the property list copy
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java
index 8f4e782..3d407d0 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_cls_create_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param prop_id the ID for the property list class being iterated over
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java
index db98a67..51a5768 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_iterate_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param plist the ID for the property list being iterated over
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java
index 1aa7ce4..2ddc980 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_prp_close_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param name the name of the property being closed
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java
index 49cef7d..53caa94 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_prp_compare_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param value1 the value of the first property being compared
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java
index f4924ee..0b2349e 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_prp_copy_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param name the name of the property being copied
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java
index bce024b..6065ce0 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_prp_create_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param name the name of the property list being created
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java
index 8c5dccc..4384ca7 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_prp_delete_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param prop_id the ID of the property list the property is deleted from
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java
index 0f3457f..999c7b0 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_prp_get_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param prop_id the ID for the property list being queried
diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java
index a55ca3a..893344b 100644
--- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java
+++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java
@@ -18,6 +18,8 @@ package hdf.hdf5lib.callbacks;
*/
public interface H5P_prp_set_func_cb extends Callbacks {
/**
+ * @ingroup JCALL
+ *
* application callback for each property list
*
* @param prop_id the ID for the property list being modified
diff --git a/java/src/hdf/hdf5lib/callbacks/package-info.java b/java/src/hdf/hdf5lib/callbacks/package-info.java
index 114045c..5ef3fab 100644
--- a/java/src/hdf/hdf5lib/callbacks/package-info.java
+++ b/java/src/hdf/hdf5lib/callbacks/package-info.java
@@ -12,6 +12,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
+ * @page CALLBACKS_UG HDF5 Java Callbacks Interface
* All callback definitions must derive from the Callbacks interface. Any
* derived interfaces must define a single public method named "callback".
* You are responsible for deregistering your callback (if necessary)
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java b/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java
index 4cb7b1d..f8b526e 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java
@@ -16,16 +16,20 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_ATTR</b>
+ * This sub-class represents HDF5 major error code <b>H5E_ATTR</b>
*/
public class HDF5AttributeException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5AttributeException</code> with no specified
* detail message.
*/
public HDF5AttributeException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5AttributeException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java b/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java
index 9f70456..71b8e47 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java
@@ -16,16 +16,20 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_BTREE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_BTREE</b>
*/
public class HDF5BtreeException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5BtreeException</code> with no specified detail
* message.
*/
public HDF5BtreeException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5BtreeException</code> with the specified detail
* message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java
index b4397b7..a837708 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java
@@ -16,16 +16,20 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_PLINE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_PLINE</b>
*/
public class HDF5DataFiltersException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DataFiltersException</code> with no specified
* detail message.
*/
public HDF5DataFiltersException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DataFiltersException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java
index f6993a8..d9f49da 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_STORAGE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_STORAGE</b>
*/
public class HDF5DataStorageException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DataStorageExceptionn</code> with no specified
* detail message.
*/
public HDF5DataStorageException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DataStorageException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java
index 8fd4ae9..fea1346 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java
@@ -16,16 +16,20 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_DATASET</b>
+ * This sub-class represents HDF5 major error code <b>H5E_DATASET</b>
*/
public class HDF5DatasetInterfaceException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DatasetInterfaceException</code> with no
* specified detail message.
*/
public HDF5DatasetInterfaceException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DatasetInterfaceException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java
index d0d2a09..e2d29d0 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_DATASPACE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_DATASPACE</b>
*/
public class HDF5DataspaceInterfaceException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DataspaceInterfaceException</code> with no
* specified detail message.
*/
public HDF5DataspaceInterfaceException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DataspaceInterfaceException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java
index 2ab4ff9..d7e678b 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_DATATYPE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_DATATYPE</b>
*/
public class HDF5DatatypeInterfaceException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DatatypeInterfaceException</code> with no
* specified detail message.
*/
public HDF5DatatypeInterfaceException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5DatatypeInterfaceException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java b/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java
index b098a12..ad42644 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java
@@ -14,21 +14,23 @@
package hdf.hdf5lib.exceptions;
/**
- * <p>
+ * @page ERRORS Errors and Exceptions
* The class HDF5Exception returns errors from the Java HDF5 Interface.
- * <p>
+ *
* Two sub-classes of HDF5Exception are defined:
* <ol>
* <li>
- * HDF5LibraryException -- errors raised the HDF5 library code
+ * HDF5LibraryException -- errors raised by the HDF5 library code
* <li>
- * HDF5JavaException -- errors raised the HDF5 Java wrapper code
+ * HDF5JavaException -- errors raised by the HDF5 Java wrapper code
* </ol>
- * <p>
+ *
* These exceptions are sub-classed to represent specific error conditions, as
* needed. In particular, HDF5LibraryException has a sub-class for each major
* error code returned by the HDF5 library.
*
+ * @defgroup JERR HDF5 Library Exception Interface
+ *
*/
public class HDF5Exception extends RuntimeException {
/**
@@ -37,12 +39,16 @@ public class HDF5Exception extends RuntimeException {
protected String detailMessage;
/**
+ * @ingroup JERR
+ *
* Constructs an <code>HDF5Exception</code> with no specified detail
* message.
*/
public HDF5Exception() { super(); }
/**
+ * @ingroup JERR
+ *
* Constructs an <code>HDF5Exception</code> with the specified detail
* message.
*
@@ -56,6 +62,8 @@ public class HDF5Exception extends RuntimeException {
}
/**
+ * @ingroup JERR
+ *
* Returns the detail message of this exception
*
* @return the detail message or <code>null</code> if this object does not
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java
index c8df3d0..f9f49a1 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_EFL</b>
+ * This sub-class represents HDF5 major error code <b>H5E_EFL</b>
*/
public class HDF5ExternalFileListException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5ExternalFileListException</code> with no
* specified detail message.
*/
public HDF5ExternalFileListException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5ExternalFileListException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java
index afd6d69..3ebe63a 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_FILE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_FILE</b>
*/
public class HDF5FileInterfaceException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5FileInterfaceException</code> with no specified
* detail message.
*/
public HDF5FileInterfaceException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5FileInterfaceException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java
index 58e2980..3dc0c72 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_ARGS</b>
+ * This sub-class represents HDF5 major error code <b>H5E_ARGS</b>
*/
public class HDF5FunctionArgumentException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5FunctionArgumentException</code> with no
* specified detail message.
*/
public HDF5FunctionArgumentException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5FunctionArgumentException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java
index db46aae..aa9289c 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_FUNC</b>
+ * This sub-class represents HDF5 major error code <b>H5E_FUNC</b>
*/
public class HDF5FunctionEntryExitException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5FunctionEntryExitException</code> with no
* specified detail message.
*/
public HDF5FunctionEntryExitException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5FunctionEntryExitException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java b/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java
index 7f1691d..ba1b5ad 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_HEAP</b>
+ * This sub-class represents HDF5 major error code <b>H5E_HEAP</b>
*/
public class HDF5HeapException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5HeapException</code> with no specified detail
* message.
*/
public HDF5HeapException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5HeapException</code> with the specified detail
* message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java b/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java
index 5ce1f01..9dd2d8a 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_ID</b>
+ * This sub-class represents HDF5 major error code <b>H5E_ID</b>
*/
public class HDF5IdException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5IdException</code> with no specified detail
* message.
*/
public HDF5IdException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5IdException</code> with the specified detail
* message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java b/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java
index 4489486..31efe56 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_INTERNAL</b>
+ * This sub-class represents HDF5 major error code <b>H5E_INTERNAL</b>
*/
public class HDF5InternalErrorException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5InternalErrorException</code> with no specified
* detail message.
*/
public HDF5InternalErrorException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5InternalErrorException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java b/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java
index ae1cf85..9b38b87 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java
@@ -14,21 +14,27 @@
package hdf.hdf5lib.exceptions;
/**
- * <p>
+ * @page ERRORSJAVA Java Wrapper Errors and Exceptions
* The class HDF5JavaException returns errors from the Java wrapper of theHDF5
* library.
* <p>
* These errors include Java configuration errors, security violations, and
* resource exhaustion.
+ *
+ * @defgroup JERRJAVA HDF5 Library Java Exception Interface
*/
public class HDF5JavaException extends HDF5Exception {
/**
+ * @ingroup JERRJAVA
+ *
* Constructs an <code>HDF5JavaException</code> with no specified detail
* message.
*/
public HDF5JavaException() { super(); }
/**
+ * @ingroup JERRJAVA
+ *
* Constructs an <code>HDF5JavaException</code> with the specified detail
* message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java b/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java
index 7c9773f..42472b53 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java
@@ -17,14 +17,16 @@ import hdf.hdf5lib.H5;
import hdf.hdf5lib.HDF5Constants;
/**
- * <p>
+ * @page ERRORSLIB HDF5 Library Errors and Exceptions
* The class HDF5LibraryException returns errors raised by the HDF5 library.
- * <p>
- * Each major error code from the HDF-5 Library is represented by a sub-class of
+ *
+ * Each major error code from the HDF5 Library is represented by a sub-class of
* this class, and by default the 'detailedMessage' is set according to the
- * minor error code from the HDF-5 Library.
+ * minor error code from the HDF5 Library.
* <p>
- * For major and minor error codes, see <b>H5Epublic.h</b> in the HDF-5 library.
+ * For major and minor error codes, @see <b>@ref H5E</b> in the HDF5 library.
+ *
+ * @defgroup JERRLIB HDF5 Library JNI Exception Interface
*
*/
@@ -36,6 +38,8 @@ public class HDF5LibraryException extends HDF5Exception {
private final long minorErrorNumber;
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5LibraryException</code> with no specified detail
* message.
*/
@@ -43,7 +47,7 @@ public class HDF5LibraryException extends HDF5Exception {
{
super();
- // this code forces the loading of the HDF-5 library
+ // this code forces the loading of the HDF5 library
// to assure that the native methods are available
try {
H5.H5open();
@@ -57,6 +61,8 @@ public class HDF5LibraryException extends HDF5Exception {
}
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5LibraryException</code> with the specified detail
* message.
*
@@ -66,7 +72,7 @@ public class HDF5LibraryException extends HDF5Exception {
public HDF5LibraryException(String s)
{
super(s);
- // this code forces the loading of the HDF-5 library
+ // this code forces the loading of the HDF5 library
// to assure that the native methods are available
try {
H5.H5open();
@@ -78,6 +84,8 @@ public class HDF5LibraryException extends HDF5Exception {
}
/**
+ * @ingroup JERRLIB
+ *
* Get the major error number of the first error on the HDF5 library error
* stack.
*
@@ -87,6 +95,8 @@ public class HDF5LibraryException extends HDF5Exception {
private native long _getMajorErrorNumber();
/**
+ * @ingroup JERRLIB
+ *
* Get the minor error number of the first error on the HDF5 library error
* stack.
*
@@ -96,9 +106,11 @@ public class HDF5LibraryException extends HDF5Exception {
private native long _getMinorErrorNumber();
/**
- * Return a error message for the minor error number.
- * <p>
- * These messages come from <b>H5Epublic.h</b>.
+ * @ingroup JERRLIB
+ *
+ * Return an error message for the minor error number.
+ *
+ * These messages come from <b>@ref H5E</b>.
*
* @param err_code
* the error code
@@ -349,20 +361,24 @@ public class HDF5LibraryException extends HDF5Exception {
}
/**
- * Prints this <code>HDF5LibraryException</code>, the HDF-5 Library error
- * stack, and the Java stack trace to the standard error stream.
+ * @ingroup JERRLIB
+ *
+ * Prints this <code>HDF5LibraryException</code>, the HDF5 Library error
+ * stack, and and the Java stack trace to the standard error stream.
*/
@Override
public void printStackTrace()
{
System.err.println(this);
- printStackTrace0(null); // the HDF-5 Library error stack
+ printStackTrace0(null); // the HDF5 Library error stack
super.printStackTrace(); // the Java stack trace
}
/**
- * Prints this <code>HDF5LibraryException</code> the HDF-5 Library error
- * stack, and the Java stack trace to the specified print stream.
+ * @ingroup JERRLIB
+ *
+ * Prints this <code>HDF5LibraryException</code> the HDF5 Library error
+ * stack, and and the Java stack trace to the specified print stream.
*
* @param f
* the file print stream.
@@ -382,14 +398,14 @@ public class HDF5LibraryException extends HDF5Exception {
catch (Exception ex) {
System.err.println(this);
};
- // the HDF-5 Library error stack
+ // the HDF5 Library error stack
printStackTrace0(f.getPath());
super.printStackTrace(); // the Java stack trace
}
}
/*
- * This private method calls the HDF-5 library to extract the error codes
+ * This private method calls the HDF5 library to extract the error codes
* and error stack.
*/
private native void printStackTrace0(String s);
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java b/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java
index fef5721..719748e 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_IO</b>
+ * This sub-class represents HDF5 major error code <b>H5E_IO</b>
*/
public class HDF5LowLevelIOException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5LowLevelIOException</code> with no specified
* detail message.
*/
public HDF5LowLevelIOException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5LowLevelIOException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java b/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java
index 4f00006..298d8b8 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_CACHE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_CACHE</b>
*/
public class HDF5MetaDataCacheException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5MetaDataCacheException</code> with no specified
* detail message.
*/
public HDF5MetaDataCacheException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5MetaDataCacheException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java
index 9675354..b6e94be 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_OHDR</b>
+ * This sub-class represents HDF5 major error code <b>H5E_OHDR</b>
*/
public class HDF5ObjectHeaderException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5ObjectHeaderException</code> with no specified
* detail message.
*/
public HDF5ObjectHeaderException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5ObjectHeaderException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java
index 66f0bd1..68d581f 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_PLIST</b>
+ * This sub-class represents HDF5 major error code <b>H5E_PLIST</b>
*/
public class HDF5PropertyListInterfaceException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5PropertyListInterfaceException</code> with no
* specified detail message.
*/
public HDF5PropertyListInterfaceException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5PropertyListInterfaceException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java
index 4feaba7..4c96136 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_REFERENCE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_REFERENCE</b>
*/
public class HDF5ReferenceException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5ReferenceException</code> with no specified
* detail message.
*/
public HDF5ReferenceException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5ReferenceException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java
index 1a007e7..f920c53 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_RESOURCE</b>
+ * This sub-class represents HDF5 major error code <b>H5E_RESOURCE</b>
*/
public class HDF5ResourceUnavailableException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5ResourceUnavailableException</code> with no
* specified detail message.
*/
public HDF5ResourceUnavailableException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5FunctionArgumentException</code> with the
* specified detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java b/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java
index 4fb8c2e..5d3aa90 100644
--- a/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java
+++ b/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java
@@ -16,17 +16,21 @@ package hdf.hdf5lib.exceptions;
/**
* The class HDF5LibraryException returns errors raised by the HDF5 library.
* <p>
- * This sub-class represents HDF-5 major error code <b>H5E_SYM</b>
+ * This sub-class represents HDF5 major error code <b>H5E_SYM</b>
*/
public class HDF5SymbolTableException extends HDF5LibraryException {
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5SymbolTableException</code> with no specified
* detail message.
*/
public HDF5SymbolTableException() { super(); }
/**
+ * @ingroup JERRLIB
+ *
* Constructs an <code>HDF5SymbolTableException</code> with the specified
* detail message.
*
diff --git a/java/src/hdf/hdf5lib/exceptions/package-info.java b/java/src/hdf/hdf5lib/exceptions/package-info.java
index 8640ccb..2ac7806 100644
--- a/java/src/hdf/hdf5lib/exceptions/package-info.java
+++ b/java/src/hdf/hdf5lib/exceptions/package-info.java
@@ -12,6 +12,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
+ * @page ERRORS_UG Errors and Exceptions
* <p>
* The package exceptions contains error classes for the Java HDF5 Interface.
* <p>
diff --git a/java/src/hdf/hdf5lib/package-info.java b/java/src/hdf/hdf5lib/package-info.java
index c04b862..7ae4df9 100644
--- a/java/src/hdf/hdf5lib/package-info.java
+++ b/java/src/hdf/hdf5lib/package-info.java
@@ -12,10 +12,11 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/**
+ @page HDF5LIB_UG HDF5 Java Package
* This package is the Java interface for the HDF5 library.
* <p>
- * This code is the called by Java programs to access the entry points of the HDF5 library. Each routine wraps
- a single
+ * This code is the called by Java programs to access the entry points of the HDF5 library.
+ * Each routine wraps a single
* HDF5 entry point, generally with the arguments and return codes analogous to the C interface.
* <p>
* For details of the HDF5 library, see the HDF5 Documentation at:
@@ -25,14 +26,13 @@
* <b>Mapping of arguments for Java</b>
*
* <p>
- * In general, arguments to the HDF Java API are straightforward translations from the 'C' API described in
- the HDF
- * Reference Manual.
+ * In general, arguments to the HDF Java API are straightforward translations from the 'C' API described
+ * in the HDF Reference Manual.
*
* <table border=1>
- * <caption><b>HDF-5 C types to Java types</b> </caption>
+ * <caption><b>HDF5 C types to Java types</b> </caption>
* <tr>
- * <td><b>HDF-5</b></td>
+ * <td><b>HDF5</b></td>
* <td><b>Java</b></td>
* </tr>
* <tr>
@@ -60,28 +60,27 @@
* <td>java.lang.String</td>
* </tr>
* <tr>
- * <td>void * <BR>
+ * <td>void * <br />
* (i.e., pointer to `Any')</td>
* <td>Special -- see HDFArray</td>
* </tr>
* </table>
* <b>General Rules for Passing Arguments and Results</b>
* <p>
- * In general, arguments passed <b>IN</b> to Java are the analogous basic types, as above. The exception is
- for arrays,
- * which are discussed below.
+ * In general, arguments passed <b>IN</b> to Java are the analogous basic types, as above. The exception
+ * is for arrays, which are discussed below.
* <p>
* The <i>return value</i> of Java methods is also the analogous type, as above. A major exception to that
- rule is that
+ * rule is that
* all HDF functions that return SUCCEED/FAIL are declared <i>boolean</i> in the Java version, rather than
- <i>int</i> as
+ * <i>int</i> as
* in the C. Functions that return a value or else FAIL are declared the equivalent to the C function.
- However, in most
+ * However, in most
* cases the Java method will raise an exception instead of returning an error code.
- * See <a href="#ERRORS">Errors and Exceptions</a> below.
+ * @see @ref ERRORS.
* <p>
* Java does not support pass by reference of arguments, so arguments that are returned through <b>OUT</b>
- parameters
+ * parameters
* must be wrapped in an object or array. The Java API for HDF consistently wraps arguments in arrays.
* <p>
* For instance, a function that returns two integers is declared:
@@ -104,12 +103,12 @@
*
* <p>
* All the routines where this convention is used will have specific documentation of the details, given
- below.
+ * below.
* <p>
* <b>Arrays</b>
* <p>
* HDF5 needs to read and write multi-dimensional arrays of any number type (and records). The HDF5 API
- describes the
+ * describes the
* layout of the source and destination, and the data for the array passed as a block of bytes, for instance,
*
* <pre>
@@ -118,52 +117,52 @@
*
* <p>
* where ``void *'' means that the data may be any valid numeric type, and is a contiguous block of bytes that
- is the
+ * is the
* data for a multi-dimensional array. The other parameters describe the dimensions, rank, and datatype of the
- array on
+ * array on
* disk (source) and in memory (destination).
* <p>
* For Java, this ``ANY'' is a problem, as the type of data must always be declared. Furthermore,
- multidimensional
+ * multidimensional
* arrays are definitely <i>not</i> laid out contiguously in memory. It would be infeasible to declare a
- separate
+ * separate
* routine for every combination of number type and dimensionality. For that reason, the
- * <a href="./hdf.hdf5lib.HDFArray.html"><b>HDFArray</b></a> class is used to discover the type, shape, and
- size of the
+ * <a href="./HDFArray.html"><b>HDFArray</b></a> class is used to discover the type, shape, and
+ * size of the
* data array at run time, and to convert to and from a contiguous array of bytes in synchronized static
- native C order.
+ * native C order.
* <p>
* The upshot is that any Java array of numbers (either primitive or sub-classes of type <b>Number</b>) can be
- passed as
+ * passed as
* an ``Object'', and the Java API will translate to and from the appropriate packed array of bytes needed by
- the C
+ * the C
* library. So the function above would be declared:
*
* <pre>
* public synchronized static native int H5Dread(long fid, long filetype, long memtype, long memspace, Object
- data);
+ * data);
* </pre>
* OPEN_IDS.addElement(id);
* and the parameter <i>data</i> can be any multi-dimensional array of numbers, such as float[][], or
- int[][][], or
+ * int[][][], or
* Double[][].
* <p>
- * <b>HDF-5 Constants</b>
+ * <b>HDF5 Constants</b>
* <p>
- * The HDF-5 API defines a set of constants and enumerated values. Most of these values are available to Java
- programs
- * via the class <a href="./hdf.hdf5lib.HDF5Constants.html"> <b>HDF5Constants</b></a>. For example, the
- parameters for
+ * The HDF5 API defines a set of constants and enumerated values. Most of these values are available to Java
+ * programs
+ * via the class <a href="./HDF5Constants.html"> <b>HDF5Constants</b></a>. For example, the
+ * parameters for
* the h5open() call include two numeric values, <b><i>HDFConstants.H5F_ACC_RDWR</i></b> and
* <b><i>HDF5Constants.H5P_DEFAULT</i></b>. As would be expected, these numbers correspond to the C constants
* <b><i>H5F_ACC_RDWR</i></b> and <b><i>H5P_DEFAULT</i></b>.
* <p>
- * The HDF-5 API defines a set of values that describe number types and sizes, such as "H5T_NATIVE_INT" and
- "hsize_t".
- * These values are determined at run time by the HDF-5 C library. To support these parameters, the Java class
- * <a href="./hdf.hdf5lib.HDF5CDataTypes.html"> <b>HDF5CDataTypes</b></a> looks up the values when initiated.
- The values
+ * The HDF5 API defines a set of values that describe number types and sizes, such as "H5T_NATIVE_INT" and
+ * "hsize_t".
+ * These values are determined at run time by the HDF5 C library. To support these parameters, the Java class
+ * <a href="./HDF5CDataTypes.html"> <b>HDF5CDataTypes</b></a> looks up the values when initiated.
+ * The values
* can be accessed as public variables of the Java class, such as:
*
* <pre>
@@ -175,31 +174,30 @@
* <p>
* <b>Error handling and Exceptions</b>
* <p>
- * The HDF5 error API (H5E) manages the behavior of the error stack in the HDF-5 library. This API is
- available from the
+ * The HDF5 error API (H5E) manages the behavior of the error stack in the HDF5 library. This API is
+ * available from the
* JHI5. Errors are converted into Java exceptions. This is totally different from the C interface, but is
- very natural
+ * very natural
* for Java programming.
* <p>
* The exceptions of the JHI5 are organized as sub-classes of the class
- * <a href="./hdf.hdf5lib.exceptions.HDF5Exception.html"> <b>HDF5Exception</b></a>. There are two subclasses
- of
- * <b>HDF5Exception</b>, <a href="./hdf.hdf5lib.exceptions.HDF5LibraryException.html">
- <b>HDF5LibraryException</b></a>
- * and <a href="./hdf.hdf5lib.exceptions.HDF5JavaException.html"> <b>HDF5JavaException</b></a>. The
- sub-classes of the
- * former represent errors from the HDF-5 C library, while sub-classes of the latter represent errors in the
- JHI5
- * wrapper and support code.
- * <p>
- * The super-class <b><i>HDF5LibraryException</i></b> implements the method '<b><i>printStackTrace()</i></b>',
- which
- * prints out the HDF-5 error stack, as described in the HDF-5 C API <i><b>H5Eprint()</b>.</i> This may be
- used by Java
- * exception handlers to print out the HDF-5 error stack.
+ * <a href="./HDF5Exception.html"> <b>HDF5Exception</b></a>. There are two subclasses
+ * of
+ * <b>HDF5Exception</b>, @ref ERRORSLIB <b>HDF5LibraryException</b>
+ * and @ref ERRORSJAVA <b>HDF5JavaException</b>.
+ * The sub-classes of the former represent errors from the HDF5 C library,
+ * while sub-classes of the latter represent errors in the JHI5 wrapper and support code.
+ * <p>
+ * The super-class <b><i>HDF5LibraryException</i></b> implements the method
+ * '<b><i>printStackTrace()</i></b>', which prints out the HDF5 error stack, as described
+ * in the HDF5 C API <i><b>@ref H5Eprint()</b>.</i> This may be
+ * used by Java
+ * exception handlers to print out the HDF5 error stack.
* <hr>
*
- * <b>See also: <a href="http://hdfgroup.org/HDF5/"> http://hdfgroup.org/HDF5"</a></b>
+ * @ref HDF5LIB
+ *
+ * <b>@see: <a href="http://hdfgroup.org/HDF5/"> HDF5"</a></b>
*
*/
package hdf.hdf5lib;
diff --git a/java/src/hdf/overview.html b/java/src/hdf/overview.html
index f6a34fc..8a9d38f 100644
--- a/java/src/hdf/overview.html
+++ b/java/src/hdf/overview.html
@@ -4,10 +4,10 @@
<h2><u>What it is</u></h2>
The <b>Java HD5 Interface (JHI5)</b> is a Java package
-(<a href="../../hdf-java-html/javadocs/hdf/hdf5lib/package-summary.html">hdf.hdf5lib</a>)
+(<a href="./hdf/hdf5lib/package-summary.html">hdf.hdf5lib</a>)
that ``wraps around'' the HDF5 library.
<p>There are a large number of functions in the HDF5
-library (version 1.13). Some of the functions are not supported in JHI5. Most
+library (version 1.14). Some of the functions are not supported in JHI5. Most
of the unsupported functions have C function pointers, which is not currently
implemented in JHI5.</p>
@@ -32,7 +32,7 @@ library contains C functions which implement the native methods. The C
functions call the standard HDF5 library, which is linked as part of the
same library on most platforms.
<p>The central part of the JHI5 is the Java class <i>
-<a href="../../hdf-java-html/javadocs/hdf/hdf5lib/H5.html">hdf.hdf5lib.H5</a></i>.
+<a href="./hdf/hdf5lib/H5.html">hdf.hdf5lib.H5</a></i>.
The <i>H5 </i>class calls the standard (<i>i.e.</i>, `native' code) HDF5
library, with native methods for most of the HDF5 functions.
@@ -42,11 +42,11 @@ The JHI5 is used by Java classes to call the HDF5 library, in order to
create HDF5 files, and read and write data in existing HDF5 files.
<p>For example, the HDF5 library has the function <b>H5Fopen</b> to open
an HDF5 file. The Java interface is the class <i>
-<a href="../../hdf-java-html/javadocs/hdf/hdf5lib/H5.html">hdf.hdf5lib.H5</a></i>,
+<a href="./hdf/hdf5lib/H5.html">hdf.hdf5lib.H5</a></i>,
which has a method:
<pre><b>static native int H5Fopen(String filename, int flags, int access );</b></pre>
The native method is implemented in C using the
-<a href="http://java.sun.com/javase/6/docs/technotes/guides/jni/index.html">Java
+<a href="https://docs.oracle.com/en/java/javase/18/docs/specs/jni/index.html">Java
Native Method Interface </a>(JNI). This is written something like the following:
<pre><b>JNIEXPORT jlong
JNICALL Java_hdf_hdf5lib_H5_H5Fopen
diff --git a/java/src/jni/exceptionImp.c b/java/src/jni/exceptionImp.c
index 0f135cd..01b4ee2 100644
--- a/java/src/jni/exceptionImp.c
+++ b/java/src/jni/exceptionImp.c
@@ -153,7 +153,7 @@ Java_hdf_hdf5lib_H5_H5error_1on(JNIEnv *env, jclass clss)
* Method: printStackTrace0
* Signature: (Ljava/lang/Object;)V
*
- * Call the HDF-5 library to print the HDF-5 error stack to 'file_name'.
+ * Call the HDF5 library to print the HDF5 error stack to 'file_name'.
*/
JNIEXPORT void JNICALL
Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0(JNIEnv *env, jobject obj, jstring file_name)
@@ -187,7 +187,7 @@ done:
* Method: _getMajorErrorNumber
* Signature: ()J
*
- * Extract the HDF-5 major error number from the HDF-5 error stack.
+ * Extract the HDF5 major error number from the HDF5 error stack.
*/
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_exceptions_HDF5LibraryException__1getMajorErrorNumber(JNIEnv *env, jobject obj)
@@ -211,7 +211,7 @@ Java_hdf_hdf5lib_exceptions_HDF5LibraryException__1getMajorErrorNumber(JNIEnv *e
* Method: _getMinorErrorNumber
* Signature: ()J
*
- * Extract the HDF-5 minor error number from the HDF-5 error stack.
+ * Extract the HDF5 minor error number from the HDF5 error stack.
*/
JNIEXPORT jlong JNICALL
Java_hdf_hdf5lib_exceptions_HDF5LibraryException__1getMinorErrorNumber(JNIEnv *env, jobject obj)
@@ -350,10 +350,10 @@ h5raiseException(JNIEnv *env, const char *message, const char *exception)
} /* end h5raiseException() */
/*
- * h5libraryError() determines the HDF-5 major error code
+ * h5libraryError() determines the HDF5 major error code
* and creates and throws the appropriate sub-class of
* HDF5LibraryException(). This routine should be called
- * whenever a call to the HDF-5 library fails, i.e., when
+ * whenever a call to the HDF5 library fails, i.e., when
* the return is -1.
*
* Note: This routine never returns from the 'throw',
@@ -436,7 +436,7 @@ done:
/*
* defineHDF5LibraryException() returns the name of the sub-class
- * which goes with an HDF-5 error code.
+ * which goes with an HDF5 error code.
*/
static const char *
defineHDF5LibraryException(hid_t maj_num)
diff --git a/java/src/jni/exceptionImp.h b/java/src/jni/exceptionImp.h
index 38469df..c7375e7 100644
--- a/java/src/jni/exceptionImp.h
+++ b/java/src/jni/exceptionImp.h
@@ -41,7 +41,7 @@ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5error_1on(JNIEnv *env, jclass clss)
* Method: printStackTrace0
* Signature: (Ljava/lang/Object;)V
*
- * Call the HDF-5 library to print the HDF-5 error stack to 'file_name'.
+ * Call the HDF5 library to print the HDF5 error stack to 'file_name'.
*/
JNIEXPORT void JNICALL Java_hdf_hdf5lib_exceptions_HDF5LibraryException_printStackTrace0(JNIEnv *env,
jobject obj,
diff --git a/java/src/jni/h5Constants.c b/java/src/jni/h5Constants.c
index bdffdbd..0eff43e 100644
--- a/java/src/jni/h5Constants.c
+++ b/java/src/jni/h5Constants.c
@@ -1210,6 +1210,11 @@ Java_hdf_hdf5lib_HDF5Constants_H5ES_1STATUS_1FAIL(JNIEnv *env, jclass cls)
{
return H5ES_STATUS_FAIL;
}
+JNIEXPORT jlong JNICALL
+Java_hdf_hdf5lib_HDF5Constants_H5ES_1STATUS_1CANCELED(JNIEnv *env, jclass cls)
+{
+ return H5ES_STATUS_CANCELED;
+}
/* Java does not have unsigned native types */
H5_GCC_CLANG_DIAG_OFF("sign-conversion")
diff --git a/java/test/TestH5.java b/java/test/TestH5.java
index b5bc3c1..062ea54 100644
--- a/java/test/TestH5.java
+++ b/java/test/TestH5.java
@@ -313,7 +313,7 @@ public class TestH5 {
@Test
public void testH5get_libversion()
{
- int libversion[] = {1, 13, 2};
+ int libversion[] = {1, 13, 3};
try {
H5.H5get_libversion(libversion);
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index ded569b..694c191 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -105,7 +105,11 @@ New Features
Documentation:
--------------
- -
+ - Doxygen User Guide documentation is available when configured and generated.
+ The resulting documentation files will be in the share/html subdirectory
+ of the HDF5 install directory.
+
+ (ADB - 2022/08/09)
Support for new platforms, languages and compilers
diff --git a/src/H5ACpublic.h b/src/H5ACpublic.h
index 0e03574..f9da6f6 100644
--- a/src/H5ACpublic.h
+++ b/src/H5ACpublic.h
@@ -563,7 +563,7 @@ typedef struct H5AC_cache_config_t {
* The value must lie in the interval [0.0, 1.0]. 0.01 is a good place to
* start in the serial case. In the parallel case, a larger value is needed
* -- see the overview of the metadata cache in the
- * “Metadata Caching in HDF5” section of the -- <em>HDF5 User’s Guide</em>
+ * “Metadata Caching in HDF5” section of the -- <em>\ref UG</em>
* for details. */
size_t max_size;
diff --git a/src/H5Amodule.h b/src/H5Amodule.h
index 3586414..7f88a22 100644
--- a/src/H5Amodule.h
+++ b/src/H5Amodule.h
@@ -28,30 +28,92 @@
#define H5_MY_PKG H5A
#define H5_MY_PKG_ERR H5E_ATTR
-/**\defgroup H5A H5A
+/** \page H5A_UG HDF5 Attributes
*
- * Use the functions in this module to manage HDF5 attributes.
+ * \section sec_attribute HDF5 Attributes
*
- * Like HDF5 datasets, HDF5 attributes are array variables which have an element
- * datatype and a shape (dataspace). However, they perform a different function:
- * Attributes decorate other HDF5 objects, and are typically used to
- * represent application metadata. Unlike datasets, the HDF5 library does not
- * support partial I/O operations for attributes and they cannot be compressed
- * or extended.
+ * An HDF5 attribute is a small metadata object describing the nature and/or intended usage of a primary data
+ * object. A primary data object may be a dataset, group, or committed datatype.
*
+ * \subsection subsec_attribute_intro Introduction
+ *
+ * Attributes are assumed to be very small as data objects go, so storing them as standard HDF5 datasets would
+ * be quite inefficient. HDF5 attributes are therefore managed through a special attributes interface,
+ * \ref H5A, which is designed to easily attach attributes to primary data objects as small datasets
+ * containing metadata information and to minimize storage requirements.
+ *
+ * Consider, as examples of the simplest case, a set of laboratory readings taken under known temperature and
+ * pressure conditions of 18.0 degrees Celsius and 0.5 atmospheres, respectively. The temperature and pressure
+ * stored as attributes of the dataset could be described as the following name/value pairs:
+ * \li temp=18.0
+ * \li pressure=0.5
+ *
+ * While HDF5 attributes are not standard HDF5 datasets, they have much in common:
+ * \li An attribute has a user-defined dataspace and the included metadata has a user-assigned datatype
+ * \li Metadata can be of any valid HDF5 datatype
+ * \li Attributes are addressed by name
+ *
+ * But there are some very important differences:
+ * \li There is no provision for special storage such as compression or chunking
+ * \li There is no partial I/O or sub-setting capability for attribute data
+ * \li Attributes cannot be shared
+ * \li Attributes cannot have attributes
+ * \li Being small, an attribute is stored in the object header of the object it describes and is thus
+ * attached directly to that object
+ *
+ * \subsection subsec_error_H5A Attribute Function Summaries
+ * @see H5A reference manual
+ *
+ * \subsection subsec_attribute_program Programming Model for Attributes
+ *
+ * The figure below shows the UML model for an HDF5 attribute and its associated dataspace and datatype.
* <table>
- * <tr><th>Create</th><th>Read</th></tr>
+ * <tr>
+ * <td>
+ * \image html UML_Attribute.jpg "The UML model for an HDF5 attribute"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Creating an attribute is similar to creating a dataset. To create an attribute, the application must
+ * specify the object to which the attribute is attached, the datatype and dataspace of the attribute
+ * data, and the attribute creation property list.
+ *
+ * The following steps are required to create and write an HDF5 attribute:
+ * \li Obtain the object identifier for the attribute’s primary data object
+ * \li Define the characteristics of the attribute and specify the attribute creation property list
+ * <ul> <li> Define the datatype</li>
+ * <li> Define the dataspace</li>
+ * <li> Specify the attribute creation property list</li></ul>
+ * \li Create the attribute
+ * \li Write the attribute data (optional)
+ * \li Close the attribute (and datatype, dataspace, and attribute creation property list, if necessary)
+ * \li Close the primary data object (if appropriate)
+ *
+ * The following steps are required to open and read/write an existing attribute. Since HDF5 attributes
+ * allow no partial I/O, you need specify only the attribute and the attribute’s memory datatype to read it:
+ * \li Obtain the object identifier for the attribute’s primary data object
+ * \li Obtain the attribute’s name or index
+ * \li Open the attribute
+ * \li Get attribute dataspace and datatype (optional)
+ * \li Specify the attribute’s memory type
+ * \li Read and/or write the attribute data
+ * \li Close the attribute
+ * \li Close the primary data object (if appropriate)
+ *
+ * <table>
+ * <tr><th>Create</th><th>Update</th></tr>
* <tr valign="top">
* <td>
* \snippet{lineno} H5A_examples.c create
* </td>
* <td>
- * \snippet{lineno} H5A_examples.c read
+ * \snippet{lineno} H5A_examples.c update
* </td>
- * <tr><th>Update</th><th>Delete</th></tr>
+ * <tr><th>Read</th><th>Delete</th></tr>
* <tr valign="top">
* <td>
- * \snippet{lineno} H5A_examples.c update
+ * \snippet{lineno} H5A_examples.c read
* </td>
* <td>
* \snippet{lineno} H5A_examples.c delete
@@ -59,6 +121,266 @@
* </tr>
* </table>
*
+ * \subsection subsec_attribute_work Working with Attributes
+ *
+ * \subsubsection subsubsec_attribute_work_struct The Structure of an Attribute
+ *
+ * An attribute has two parts: name and value(s).
+ *
+ * HDF5 attributes are sometimes discussed as name/value pairs in the form name=value.
+ *
+ * An attribute’s name is a null-terminated ASCII or UTF-8 character string. Each attribute attached to an
+ * object has a unique name.
+ *
+ * The value portion of the attribute contains one or more data elements of the same datatype.
+ *
+ * HDF5 attributes have all the characteristics of HDF5 datasets except that there is no partial I/O
+ * capability. In other words, attributes can be written and read only in full with no sub-setting.
+ *
+ * \subsubsection subsubsec_attribute_work_create Creating, Writing, and Reading Attributes
+ *
+ * If attributes are used in an HDF5 file, these functions will be employed: \ref H5Acreate, \ref H5Awrite,
+ * and \ref H5Aread. \ref H5Acreate and \ref H5Awrite are used together to place the attribute in the file. If
+ * an attribute is to be used and is not currently in memory, \ref H5Aread generally comes into play
+ * usually in concert with one each of the H5Aget_* and H5Aopen_* functions.
+ *
+ * To create an attribute, call H5Acreate:
+ * \code
+ * hid_t H5Acreate (hid_t loc_id, const char *name,
+ * hid_t type_id, hid_t space_id, hid_t create_plist,
+ * hid_t access_plist)
+ * \endcode
+ * loc_id identifies the object (dataset, group, or committed datatype) to which the attribute is to be
+ * attached. name, type_id, space_id, and create_plist convey, respectively, the attribute’s name, datatype,
+ * dataspace, and attribute creation property list. The attribute’s name must be locally unique: it must be
+ * unique within the context of the object to which it is attached.
+ *
+ * \ref H5Acreate creates the attribute in memory. The attribute does not exist in the file until
+ * \ref H5Awrite writes it there.
+ *
+ * To write or read an attribute, call H5Awrite or H5Aread, respectively:
+ * \code
+ * herr_t H5Awrite (hid_t attr_id, hid_t mem_type_id, const void *buf)
+ * herr_t H5Aread (hid_t attr_id, hid_t mem_type_id, void *buf)
+ * \endcode
+ * attr_id identifies the attribute while mem_type_id identifies the in-memory datatype of the attribute data.
+ *
+ * \ref H5Awrite writes the attribute data from the buffer buf to the file. \ref H5Aread reads attribute data
+ * from the file into buf.
+ *
+ * The HDF5 Library converts the metadata between the in-memory datatype, mem_type_id, and the in-file
+ * datatype, defined when the attribute was created, without user intervention.
+ *
+ * \subsubsection subsubsec_attribute_work_access Accessing Attributes by Name or Index
+ *
+ * Attributes can be accessed by name or index value. The use of an index value makes it possible to iterate
+ * through all of the attributes associated with a given object.
+ *
+ * To access an attribute by its name, use the \ref H5Aopen_by_name function. \ref H5Aopen_by_name returns an
+ * attribute identifier that can then be used by any function that must access an attribute such as \ref
+ * H5Aread. Use the function \ref H5Aget_name to determine an attribute’s name.
+ *
+ * To access an attribute by its index value, use the \ref H5Aopen_by_idx function. To determine an attribute
+ * index value when it is not already known, use the H5Oget_info function. \ref H5Aopen_by_idx is generally
+ * used in the course of opening several attributes for later access. Use \ref H5Aiterate if the intent is to
+ * perform the same operation on every attribute attached to an object.
+ *
+ * \subsubsection subsubsec_attribute_work_info Obtaining Information Regarding an Object’s Attributes
+ *
+ * In the course of working with HDF5 attributes, one may need to obtain any of several pieces of information:
+ * \li An attribute name
+ * \li The dataspace of an attribute
+ * \li The datatype of an attribute
+ * \li The number of attributes attached to an object
+ *
+ * To obtain an attribute’s name, call H5Aget_name with an attribute identifier, attr_id:
+ * \code
+ * ssize_t H5Aget_name (hid_t attr_id, size_t buf_size, char *buf)
+ * \endcode
+ * As with other attribute functions, attr_id identifies the attribute; buf_size defines the size of the
+ * buffer; and buf is the buffer to which the attribute’s name will be read.
+ *
+ * If the length of the attribute name, and hence the value required for buf_size, is unknown, a first call
+ * to \ref H5Aget_name will return that size. If the value of buf_size used in that first call is too small,
+ * the name will simply be truncated in buf. A second \ref H5Aget_name call can then be used to retrieve the
+ * name in an appropriately-sized buffer.
+ *
+ * To determine the dataspace or datatype of an attribute, call \ref H5Aget_space or \ref H5Aget_type,
+ * respectively: \code hid_t H5Aget_space (hid_t attr_id) hid_t H5Aget_type (hid_t attr_id) \endcode \ref
+ * H5Aget_space returns the dataspace identifier for the attribute attr_id. \ref H5Aget_type returns the
+ * datatype identifier for the attribute attr_id.
+ *
+ * To determine the number of attributes attached to an object, use the \ref H5Oget_info function. The
+ * function signature is below. \code herr_t H5Oget_info( hid_t object_id, H5O_info_t *object_info ) \endcode
+ * The number of attributes will be returned in the object_info buffer. This is generally the preferred first
+ * step in determining attribute index values. If the call returns N, the attributes attached to the object
+ * object_id have index values of 0 through N-1.
+ *
+ * \subsubsection subsubsec_attribute_work_iterate Iterating across an Object’s Attributes
+ *
+ * It is sometimes useful to be able to perform the identical operation across all of the attributes attached
+ * to an object. At the simplest level, you might just want to open each attribute. At a higher level, you
+ * might wish to perform a rather complex operation on each attribute as you iterate across the set.
+ *
+ * To iterate an operation across the attributes attached to an object, one must make a series of calls to
+ * \ref H5Aiterate
+ * \code
+ * herr_t H5Aiterate (hid_t obj_id, H5_index_t index_type,
+ * H5_iter_order_t order, hsize_t *n, H5A_operator2_t op,
+ * void *op_data)
+ * \endcode
+ * \ref H5Aiterate successively marches across all of the attributes attached to the object specified in
+ * loc_id, performing the operation(s) specified in op_func with the data specified in op_data on each
+ * attribute.
+ *
+ * When \ref H5Aiterate is called, index contains the index of the attribute to be accessed in this call. When
+ * \ref H5Aiterate returns, index will contain the index of the next attribute. If the returned index is the
+ * null pointer, then all attributes have been processed, and the iterative process is complete.
+ *
+ * op_func is a user-defined operation that adheres to the \ref H5A_operator_t prototype. This prototype and
+ * certain requirements imposed on the operator’s behavior are described in the \ref H5Aiterate entry in the
+ * \ref RM.
+ *
+ * op_data is also user-defined to meet the requirements of op_func. Beyond providing a parameter with which
+ * to pass this data, HDF5 provides no tools for its management and imposes no restrictions.
+ *
+ * \subsubsection subsubsec_attribute_work_delete Deleting an Attribute
+ *
+ * Once an attribute has outlived its usefulness or is no longer appropriate, it may become necessary to
+ * delete it.
+ *
+ * To delete an attribute, call \ref H5Adelete
+ * \code
+ * herr_t H5Adelete (hid_t loc_id, const char *name)
+ * \endcode
+ * \ref H5Adelete removes the attribute name from the group, dataset, or committed datatype specified in
+ * loc_id.
+ *
+ * \ref H5Adelete must not be called if there are any open attribute identifiers on the object loc_id. Such a
+ * call can cause the internal attribute indexes to change; future writes to an open attribute would then
+ * produce unintended results.
+ *
+ * \subsubsection subsubsec_attribute_work_close Closing an Attribute
+ *
+ * As is the case with all HDF5 objects, once access to an attribute it is no longer needed, that attribute
+ * must be closed. It is best practice to close it as soon as practicable; it is mandatory that it be closed
+ * prior to the H5close call closing the HDF5 Library.
+ *
+ * To close an attribute, call \ref H5Aclose
+ * \code
+ * herr_t H5Aclose (hid_t attr_id)
+ * \endcode
+ * \ref H5Aclose closes the specified attribute by terminating access to its identifier, attr_id.
+ *
+ * \subsection subsec_attribute_special Special Issues
+ *
+ * Some special issues for attributes are discussed below.
+ *
+ * <h4>Large Numbers of Attributes Stored in Dense Attribute Storage</h4>
+ *
+ * The dense attribute storage scheme was added in version 1.8 so that datasets, groups, and committed
+ * datatypes that have large numbers of attributes could be processed more quickly.
+ *
+ * Attributes start out being stored in an object's header. This is known as compact storage. For more
+ * information, see "Storage Strategies."
+ *
+ * As the number of attributes grows, attribute-related performance slows. To improve performance, dense
+ * attribute storage can be initiated with the H5Pset_attr_phase_change function. See the HDF5 Reference
+ * Manual for more information.
+ *
+ * When dense attribute storage is enabled, a threshold is defined for the number of attributes kept in
+ * compact storage. When the number is exceeded, the library moves all of the attributes into dense storage
+ * at another location. The library handles the movement of attributes and the pointers between the locations
+ * automatically. If some of the attributes are deleted so that the number falls below the threshold, then
+ * the attributes are moved back to compact storage by the library.
+ *
+ * The improvements in performance from using dense attribute storage are the result of holding attributes
+ * in a heap and indexing the heap with a B-tree.
+ *
+ * Note that there are some disadvantages to using dense attribute storage. One is that this is a new feature.
+ * Datasets, groups, and committed datatypes that use dense storage cannot be read by applications built with
+ * earlier versions of the library. Another disadvantage is that attributes in dense storage cannot be
+ * compressed.
+ *
+ * <h4>Large Attributes Stored in Dense Attribute Storage</h4>
+ *
+ * We generally consider the maximum size of an attribute to be 64K bytes. The library has two ways of storing
+ * attributes larger than 64K bytes: in dense attribute storage or in a separate dataset. Using dense
+ * attribute storage is described in this section, and storing in a separate dataset is described in the next
+ * section.
+ *
+ * To use dense attribute storage to store large attributes, set the number of attributes that will be stored
+ * in compact storage to 0 with the H5Pset_attr_phase_change function. This will force all attributes to be
+ * put into dense attribute storage and will avoid the 64KB size limitation for a single attribute in compact
+ * attribute storage.
+ *
+ * The example code below illustrates how to create a large attribute that will be kept in dense storage.
+ *
+ * <table>
+ * <tr><th>Create</th></tr>
+ * <tr valign="top">
+ * <td>
+ * \snippet{lineno} H5A_examples.c create
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Large Attributes Stored in a Separate Dataset</h4>
+ *
+ * In addition to dense attribute storage (see above), a large attribute can be stored in a separate dataset.
+ * In the figure below, DatasetA holds an attribute that is too large for the object header in Dataset1. By
+ * putting a pointer to DatasetA as an attribute in Dataset1, the attribute becomes available to those
+ * working with Dataset1.
+ * This way of handling large attributes can be used in situations where backward compatibility is important
+ * and where compression is important. Applications built with versions before 1.8.x can read large
+ * attributes stored in separate datasets. Datasets can be compressed while attributes cannot.
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Shared_Attribute.jpg "A large or shared HDF5 attribute and its associated dataset(s)"
+ * </td>
+ * </tr>
+ * </table>
+ * Note: In the figure above, DatasetA is an attribute of Dataset1 that is too large to store in Dataset1's
+ * header. DatasetA is associated with Dataset1 by means of an object reference pointer attached as an
+ * attribute to Dataset1. The attribute in DatasetA can be shared among multiple datasets by means of
+ * additional object reference pointers attached to additional datasets.
+ *
+ * <h4>Shared Attributes</h4>
+ *
+ * Attributes written and managed through the \ref H5A interface cannot be shared. If shared attributes are
+ * required, they must be handled in the manner described above for large attributes and illustrated in
+ * the figure above.
+ *
+ * <h4>Attribute Names</h4>
+ *
+ * While any ASCII or UTF-8 character may be used in the name given to an attribute, it is usually wise
+ * to avoid the following kinds of characters:
+ * \li Commonly used separators or delimiters such as slash, backslash, colon, and semi-colon (\, /, :, ;)
+ * \li Escape characters
+ * \li Wild cards such as asterisk and question mark (*, ?)
+ * NULL can be used within a name, but HDF5 names are terminated with a NULL: whatever comes after the NULL
+ * will be ignored by HDF5.
+ *
+ * The use of ASCII or UTF-8 characters is determined by the character encoding property. See
+ * #H5Pset_char_encoding in the \ref RM.
+ *
+ * <h4>No Special I/O or Storage</h4>
+ *
+ * HDF5 attributes have all the characteristics of HDF5 datasets except the following:
+ * \li Attributes are written and read only in full: there is no provision for partial I/O or sub-setting
+ * \li No special storage capability is provided for attributes: there is no compression or chunking, and
+ * attributes are not extendable
+ *
+ * Previous Chapter \ref sec_dataspace - Next Chapter \ref sec_error
+ *
+ * \defgroup H5A Attributes (H5A)
+ *
+ * An HDF5 attribute is a small metadata object describing the nature and/or intended usage of a primary data
+ * object. A primary data object may be a dataset, group, or committed datatype.
+ *
+ * @see sec_attribute
+ *
*/
#endif /* H5Amodule_H */
diff --git a/src/H5Dmodule.h b/src/H5Dmodule.h
index a05d717..474efd9 100644
--- a/src/H5Dmodule.h
+++ b/src/H5Dmodule.h
@@ -28,7 +28,2961 @@
#define H5_MY_PKG H5D
#define H5_MY_PKG_ERR H5E_DATASET
-/**\defgroup H5D H5D
+/** \page H5D_UG HDF5 Datasets
+ *
+ * \section sec_dataset HDF5 Datasets
+ *
+ * \subsection subsec_dataset_intro Introduction
+ *
+ * An HDF5 dataset is an object composed of a collection of data elements, or raw data, and
+ * metadata that stores a description of the data elements, data layout, and all other information
+ * necessary to write, read, and interpret the stored data. From the viewpoint of the application the
+ * raw data is stored as a one-dimensional or multi-dimensional array of elements (the raw data),
+ * those elements can be any of several numerical or character types, small arrays, or even
+ * compound types similar to C structs. The dataset object may have attribute objects. See the
+ * figure below.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig1.gif "Application view of a dataset"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * A dataset object is stored in a file in two parts: a header and a data array. The header contains
+ * information that is needed to interpret the array portion of the dataset, as well as metadata (or
+ * pointers to metadata) that describes or annotates the dataset. Header information includes the
+ * name of the object, its dimensionality, its number-type, information about how the data itself is
+ * stored on disk (the storage layout), and other information used by the library to speed up access
+ * to the dataset or maintain the file’s integrity.
+ *
+ * The HDF5 dataset interface, comprising the @ref H5D functions, provides a mechanism for managing
+ * HDF5 datasets including the transfer of data between memory and disk and the description of
+ * dataset properties.
+ *
+ * A dataset is used by other HDF5 APIs, either by name or by an identifier. For more information,
+ * \see \ref api-compat-macros.
+ *
+ * \subsubsection subsubsec_dataset_intro_link Link/Unlink
+ * A dataset can be added to a group with one of the H5Lcreate calls, and deleted from a group with
+ * #H5Ldelete. The link and unlink operations use the name of an object, which may be a dataset.
+ * The dataset does not have to open to be linked or unlinked.
+ *
+ * \subsubsection subsubsec_dataset_intro_obj Object Reference
+ * A dataset may be the target of an object reference. The object reference is created by
+ * #H5Rcreate with the name of an object which may be a dataset and the reference type
+ * #H5R_OBJECT. The dataset does not have to be open to create a reference to it.
+ *
+ * An object reference may also refer to a region (selection) of a dataset. The reference is created
+ * with #H5Rcreate and a reference type of #H5R_DATASET_REGION.
+ *
+ * An object reference can be accessed by a call to #H5Rdereference. When the reference is to a
+ * dataset or dataset region, the #H5Rdereference call returns an identifier to the dataset just as if
+ * #H5Dopen has been called.
+ *
+ * \subsubsection subsubsec_dataset_intro_attr Adding Attributes
+ * A dataset may have user-defined attributes which are created with #H5Acreate and accessed
+ * through the @ref H5A API. To create an attribute for a dataset, the dataset must be open, and the
+ * identifier is passed to #H5Acreate. The attributes of a dataset are discovered and opened using
+ * #H5Aopen_name, #H5Aopen_idx, or #H5Aiterate; these functions use the identifier of the dataset.
+ * An attribute can be deleted with #H5Adelete which also uses the identifier of the dataset.
+ *
+ * \subsection subsec_dataset_function Dataset Function Summaries
+ * Functions that can be used with datasets (@ref H5D functions) and property list functions that can
+ * used with datasets (@ref H5P functions) are listed below.
+ *
+ * <table>
+ * <caption>Dataset functions</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Dcreate</td>
+ * <td>Creates a dataset at the specified location. The
+ * C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dcreate_anon</td>
+ * <td>Creates a dataset in a file without linking it into the file structure.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dopen</td>
+ * <td>Opens an existing dataset. The C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dclose</td>
+ * <td>Closes the specified dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dget_space</td>
+ * <td>Returns an identifier for a copy of the dataspace for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dget_space_status</td>
+ * <td>Determines whether space has been allocated for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dget_type</td>
+ * <td>Returns an identifier for a copy of the datatype for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dget_create_plist</td>
+ * <td>Returns an identifier for a copy of the dataset creation property list for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dget_access_plist</td>
+ * <td>Returns the dataset access property list associated with a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dget_offset</td>
+ * <td>Returns the dataset address in a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dget_storage_size</td>
+ * <td>Returns the amount of storage required for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dvlen_get_buf_size</td>
+ * <td>Determines the number of bytes required to store variable-length (VL) data.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dvlen_reclaim</td>
+ * <td>Reclaims VL datatype memory buffers.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dread</td>
+ * <td>Reads raw data from a dataset into a buffer.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dwrite</td>
+ * <td>Writes raw data from a buffer to a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Diterate</td>
+ * <td>Iterates over all selected elements in a dataspace.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dgather</td>
+ * <td>Gathers data from a selection within a memory buffer.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dscatter</td>
+ * <td>Scatters data into a selection within a memory buffer.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dfill</td>
+ * <td>Fills dataspace elements with a fill value in a memory buffer.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Dset_extent</td>
+ * <td>Changes the sizes of a dataset’s dimensions.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>Dataset creation property list functions (H5P)</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_layout</td>
+ * <td>Sets the type of storage used to store the raw data for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_layout</td>
+ * <td>Returns the layout of the raw data for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_chunk</td>
+ * <td>Sets the size of the chunks used to store a chunked layout dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_chunk</td>
+ * <td>Retrieves the size of chunks for the raw data of a chunked layout dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_deflate</td>
+ * <td>Sets compression method and compression level.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fill_value</td>
+ * <td>Sets the fill value for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_fill_value</td>
+ * <td>Retrieves a dataset fill value.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pfill_value_defined</td>
+ * <td>Determines whether the fill value is defined.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fill_time</td>
+ * <td>Sets the time when fill values are written to a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_fill_time</td>
+ * <td>Retrieves the time when fill value are written to a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_alloc_time</td>
+ * <td>Sets the timing for storage space allocation.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_alloc_time</td>
+ * <td>Retrieves the timing for storage space allocation.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_filter</td>
+ * <td>Adds a filter to the filter pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pall_filters_avail</td>
+ * <td>Verifies that all required filters are available.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_nfilters</td>
+ * <td>Returns the number of filters in the pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_filter</td>
+ * <td>Returns information about a filter in a pipeline.
+ * The C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_filter_by_id</td>
+ * <td>Returns information about the specified filter.
+ * The C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pmodify_filter</td>
+ * <td>Modifies a filter in the filter pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Premove_filter</td>
+ * <td>Deletes one or more filters in the filter pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fletcher32</td>
+ * <td>Sets up use of the Fletcher32 checksum filter.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_nbit</td>
+ * <td>Sets up use of the n-bit filter.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_scaleoffset</td>
+ * <td>Sets up use of the scale-offset filter.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_shuffle</td>
+ * <td>Sets up use of the shuffle filter.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_szip</td>
+ * <td>Sets up use of the Szip compression filter.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_external</td>
+ * <td>Adds an external file to the list of external files.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_external_count</td>
+ * <td>Returns the number of external files for a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_external</td>
+ * <td>Returns information about an external file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_char_encoding</td>
+ * <td>Sets the character encoding used to encode a string. Use to set ASCII or UTF-8 character
+ * encoding for object names.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_char_encoding</td>
+ * <td>Retrieves the character encoding used to create a string.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>Dataset access property list functions (H5P)</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_buffer</td>
+ * <td>Sets type conversion and background buffers.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_buffer</td>
+ * <td>Reads buffer settings.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_chunk_cache</td>
+ * <td>Sets the raw data chunk cache parameters.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_chunk_cache</td>
+ * <td>Retrieves the raw data chunk cache parameters.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_edc_check</td>
+ * <td>Sets whether to enable error-detection when reading a dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_edc_check</td>
+ * <td>Determines whether error-detection is enabled for dataset reads.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_filter_callback</td>
+ * <td>Sets user-defined filter callback function.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_data_transform</td>
+ * <td>Sets a data transform expression.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_data_transform</td>
+ * <td>Retrieves a data transform expression.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_type_conv_cb</td>
+ * <td>Sets user-defined datatype conversion callback function.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_type_conv_cb</td>
+ * <td>Gets user-defined datatype conversion callback function.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_hyper_vector_size</td>
+ * <td>Sets number of I/O vectors to be read/written in hyperslab I/O.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_hyper_vector_size</td>
+ * <td>Retrieves number of I/O vectors to be read/written in hyperslab I/O.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_btree_ratios</td>
+ * <td>Sets B-tree split ratios for a dataset transfer property list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_btree_ratios</td>
+ * <td>Gets B-tree split ratios for a dataset transfer property list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_vlen_mem_manager</td>
+ * <td>Sets the memory manager for variable-length datatype allocation in #H5Dread and
+ * #H5Dvlen_reclaim.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_vlen_mem_manager</td>
+ * <td>Gets the memory manager for variable-length datatype allocation in #H5Dread and
+ * #H5Dvlen_reclaim.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_dxpl_mpio</td>
+ * <td>Sets data transfer mode.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_dxpl_mpio</td>
+ * <td>Returns the data transfer mode.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_dxpl_mpio_chunk_opt</td>
+ * <td>Sets a flag specifying linked-chunk I/O or multi-chunk I/O.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_dxpl_mpio_chunk_opt_num</td>
+ * <td>Sets a numeric threshold for linked-chunk I/O.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_dxpl_mpio_chunk_opt_ratio</td>
+ * <td>Sets a ratio threshold for collective I/O.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_dxpl_mpio_collective_opt</td>
+ * <td>Sets a flag governing the use of independent versus collective I/O.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_multi_type</td>
+ * <td>Sets the type of data property for the MULTI driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_multi_type</td>
+ * <td>Retrieves the type of data property for the MULTI driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_small_data_block_size</td>
+ * <td>Sets the size of a contiguous block reserved for small data.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_small_data_block_size</td>
+ * <td>Retrieves the current small data block size setting.</td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_dataset_program Programming Model for Datasets
+ * This section explains the programming model for datasets.
+ *
+ * \subsubsection subsubsec_dataset_program_general General Model
+ *
+ * The programming model for using a dataset has three main phases:
+ * \li Obtain access to the dataset
+ * \li Operate on the dataset using the dataset identifier returned at access
+ * \li Release the dataset
+ *
+ * These three phases or steps are described in more detail below the figure.
+ *
+ * A dataset may be opened several times and operations performed with several different
+ * identifiers to the same dataset. All the operations affect the dataset although the calling program
+ * must synchronize if necessary to serialize accesses.
+ *
+ * Note that the dataset remains open until every identifier is closed. The figure below shows the
+ * basic sequence of operations.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig2.gif "Dataset programming sequence"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Creation and data access operations may have optional parameters which are set with property
+ * lists. The general programming model is:
+ * \li Create property list of appropriate class (dataset create, dataset transfer)
+ * \li Set properties as needed; each type of property has its own format and datatype
+ * \li Pass the property list as a parameter of the API call
+ *
+ * The steps below describe the programming phases or steps for using a dataset.
+ * <h4>Step 1. Obtain Access</h4>
+ * A new dataset is created by a call to #H5Dcreate. If successful, the call returns an identifier for the
+ * newly created dataset.
+ *
+ * Access to an existing dataset is obtained by a call to #H5Dopen. This call returns an identifier for
+ * the existing dataset.
+ *
+ * An object reference may be dereferenced to obtain an identifier to the dataset it points to.
+ *
+ * In each of these cases, the successful call returns an identifier to the dataset. The identifier is
+ * used in subsequent operations until the dataset is closed.
+ *
+ * <h4>Step 2. Operate on the Dataset</h4>
+ * The dataset identifier can be used to write and read data to the dataset, to query and set
+ * properties, and to perform other operations such as adding attributes, linking in groups, and
+ * creating references.
+ *
+ * The dataset identifier can be used for any number of operations until the dataset is closed.
+ *
+ * <h4>Step 3. Close the Dataset</h4>
+ * When all operations are completed, the dataset identifier should be closed with a call to
+ * #H5Dclose. This releases the dataset.
+ *
+ * After the identifier is closed, it cannot be used for further operations.
+ *
+ * \subsubsection subsubsec_dataset_program_create Create Dataset
+ *
+ * A dataset is created and initialized with a call to #H5Dcreate. The dataset create operation sets
+ * permanent properties of the dataset:
+ * \li Name
+ * \li Dataspace
+ * \li Datatype
+ * \li Storage properties
+ *
+ * These properties cannot be changed for the life of the dataset, although the dataspace may be
+ * expanded up to its maximum dimensions.
+ *
+ * <h4>Name</h4>
+ * A dataset name is a sequence of alphanumeric ASCII characters. The full name would include a
+ * tracing of the group hierarchy from the root group of the file. An example is
+ * /rootGroup/groupA/subgroup23/dataset1. The local name or relative name within the lowest-
+ * level group containing the dataset would include none of the group hierarchy. An example is
+ * Dataset1.
+ *
+ * <h4>Dataspace</h4>
+ * The dataspace of a dataset defines the number of dimensions and the size of each dimension. The
+ * dataspace defines the number of dimensions, and the maximum dimension sizes and current size
+ * of each dimension. The maximum dimension size can be a fixed value or the constant
+ * #H5S_UNLIMITED, in which case the actual dimension size can be changed with calls to
+ * #H5Dset_extent, up to the maximum set with the maxdims parameter in the #H5Screate_simple
+ * call that established the dataset’s original dimensions. The maximum dimension size is set when
+ * the dataset is created and cannot be changed.
+ *
+ * <h4>Datatype</h4>
+ * Raw data has a datatype which describes the layout of the raw data stored in the file. The
+ * datatype is set when the dataset is created and can never be changed. When data is transferred to
+ * and from the dataset, the HDF5 library will assure that the data is transformed to and from the
+ * stored format.
+ *
+ * <h4>Storage Properties</h4>
+ * Storage properties of the dataset are set when it is created. The required inputs table below shows
+ * the categories of storage properties. The storage properties cannot be changed after the dataset is
+ * created.
+ *
+ * <h4>Filters</h4>
+ * When a dataset is created, optional filters are specified. The filters are added to the data transfer
+ * pipeline when data is read or written. The standard library includes filters to implement
+ * compression, data shuffling, and error detection code. Additional user-defined filters may also be
+ * used.
+ *
+ * The required filters are stored as part of the dataset, and the list may not be changed after the
+ * dataset is created. The HDF5 library automatically applies the filters whenever data is
+ * transferred.
+ *
+ * <h4>Summary</h4>
+ *
+ * A newly created dataset has no attributes and no data values. The dimensions, datatype, storage
+ * properties, and selected filters are set. The table below lists the required inputs, and the second
+ * table below lists the optional inputs.
+ *
+ * <table>
+ * <caption>Required inputs</caption>
+ * <tr>
+ * <th>Required Inputs</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Dataspace</td>
+ * <td>The shape of the array.</td>
+ * </tr>
+ * <tr>
+ * <td>Datatype</td>
+ * <td>The layout of the stored elements.</td>
+ * </tr>
+ * <tr>
+ * <td>Name</td>
+ * <td>The name of the dataset in the group.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>Optional inputs</caption>
+ * <tr>
+ * <th>Optional Inputs</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Storage Layout</td>
+ * <td>How the data is organized in the file including chunking.</td>
+ * </tr>
+ * <tr>
+ * <td>Fill Value</td>
+ * <td>The behavior and value for uninitialized data.</td>
+ * </tr>
+ * <tr>
+ * <td>External Storage</td>
+ * <td>Option to store the raw data in an external file.</td>
+ * </tr>
+ * <tr>
+ * <td>Filters</td>
+ * <td>Select optional filters to be applied. One of the filters that might be applied is compression.</td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Example</h4>
+ * To create a new dataset, go through the following general steps:
+ * \li Set dataset characteristics (optional where default settings are acceptable)
+ * \li Datatype
+ * \li Dataspace
+ * \li Dataset creation property list
+ * \li Create the dataset
+ * \li Close the datatype, dataspace, and property list (as necessary)
+ * \li Close the dataset
+ *
+ * Example 1 below shows example code to create an empty dataset. The dataspace is 7 x 8, and the
+ * datatype is a big-endian integer. The dataset is created with the name “dset1” and is a member of
+ * the root group, “/”.
+ *
+ * <em> Example 1. Create an empty dataset</em>
+ * \code
+ * hid_t dataset, datatype, dataspace;
+ *
+ * // Create dataspace: Describe the size of the array and create the dataspace for fixed-size dataset.
+ * dimsf[0] = 7;
+ * dimsf[1] = 8;
+ * dataspace = H5Screate_simple(2, dimsf, NULL);
+ *
+ * // Define datatype for the data in the file.
+ * // For this example, store little-endian integer numbers.
+ * datatype = H5Tcopy(H5T_NATIVE_INT);
+ * status = H5Tset_order(datatype, H5T_ORDER_LE);
+ *
+ * // Create a new dataset within the file using defined
+ * // dataspace and datatype. No properties are set.
+ * dataset = H5Dcreate(file, "/dset", datatype, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * H5Dclose(dataset);
+ * H5Sclose(dataspace);
+ * H5Tclose(datatype);
+ * \endcode
+ *
+ * Example 2, below, shows example code to create a similar dataset with a fill value of ‘-1’. This
+ * code has the same steps as in the example above, but uses a non-default property list. A file
+ * creation property list is created, and then the fill value is set to the desired value. Then the
+ * property list is passed to the #H5Dcreate call.
+ *
+ * <em> Example 2. Create a dataset with fill value set</em>
+ * \code
+ * hid_t plist; // property list
+ * hid_t dataset, datatype, dataspace;
+ * int fillval = -1;
+ *
+ * dimsf[0] = 7;
+ * dimsf[1] = 8;
+ * dataspace = H5Screate_simple(2, dimsf, NULL);
+ * datatype = H5Tcopy(H5T_NATIVE_INT);
+ * status = H5Tset_order(datatype, H5T_ORDER_LE);
+ *
+ * // Example of Dataset Creation property list: set fill value to '-1'
+ * plist = H5Pcreate(H5P_DATASET_CREATE);
+ * status = H5Pset_fill_value(plist, datatype, &fillval);
+ *
+ * // Same as above, but use the property list
+ * dataset = H5Dcreate(file, "/dset", datatype, dataspace, H5P_DEFAULT, plist, H5P_DEFAULT);
+ * H5Dclose(dataset);
+ * H5Sclose(dataspace);
+ * H5Tclose(datatype);
+ * H5Pclose(plist);
+ * \endcode
+ *
+ * After this code is executed, the dataset has been created and written to the file. The data array is
+ * uninitialized. Depending on the storage strategy and fill value options that have been selected,
+ * some or all of the space may be allocated in the file, and fill values may be written in the file.
+ *
+ * \subsubsection subsubsec_dataset_program_transfer Data Transfer Operations on a Dataset
+ * Data is transferred between memory and the raw data array of the dataset through #H5Dwrite and
+ * #H5Dread operations. A data transfer has the following basic steps:
+ * \li 1. Allocate and initialize memory space as needed
+ * \li 2. Define the datatype of the memory elements
+ * \li 3. Define the elements to be transferred (a selection, or all the elements)
+ * \li 4. Set data transfer properties (including parameters for filters or file drivers) as needed
+ * \li 5. Call the @ref H5D API
+ *
+ * Note that the location of the data in the file, the datatype of the data in the file, the storage
+ * properties, and the filters do not need to be specified because these are stored as a permanent part
+ * of the dataset. A selection of elements from the dataspace is specified; the selected elements may
+ * be the whole dataspace.
+ *
+ * The following figure shows a diagram of a write operation which
+ * transfers a data array from memory to a dataset in the file (usually on disk). A read operation has
+ * similar parameters with the data flowing the other direction.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig3.gif "A write operation"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Memory Space</h4>
+ * The calling program must allocate sufficient memory to store the data elements to be transferred.
+ * For a write (from memory to the file), the memory must be initialized with the data to be written
+ * to the file. For a read, the memory must be large enough to store the elements that will be read.
+ * The amount of storage needed can be computed from the memory datatype (which defines the
+ * size of each data element) and the number of elements in the selection.
+ *
+ * <h4>Memory Datatype</h4>
+ * The memory layout of a single data element is specified by the memory datatype. This specifies
+ * the size, alignment, and byte order of the element as well as the datatype class. Note that the
+ * memory datatype must be the same datatype class as the file, but may have different byte order
+ * and other properties. The HDF5 Library automatically transforms data elements between the
+ * source and destination layouts. For more information, \ref sec_datatype.
+ *
+ * For a write, the memory datatype defines the layout of the data to be written; an example is IEEE
+ * floating-point numbers in native byte order. If the file datatype (defined when the dataset is
+ * created) is different but compatible, the HDF5 Library will transform each data element when it
+ * is written. For example, if the file byte order is different than the native byte order, the HDF5
+ * library will swap the bytes.
+ *
+ * For a read, the memory datatype defines the desired layout of the data to be read. This must be
+ * compatible with the file datatype, but should generally use native formats such as byte orders.
+ * The HDF5 library will transform each data element as it is read.
+ *
+ * <h4>Selection</h4>
+ * The data transfer will transfer some or all of the elements of the dataset depending on the
+ * dataspace selection. The selection has two dataspace objects: one for the source, and one for the
+ * destination. These objects describe which elements of the dataspace to be transferred. Some
+ * (partial I/O) or all of the data may be transferred. Partial I/O is defined by defining hyperslabs or
+ * lists of elements in a dataspace object.
+ *
+ * The dataspace selection for the source defines the indices of the elements to be read or written.
+ * The two selections must define the same number of points, but the order and layout may be
+ * different. The HDF5 Library automatically selects and distributes the elements according to the
+ * selections. It might, for example, perform a scatter-gather or sub-set of the data.
+ *
+ * <h4>Data Transfer Properties</h4>
+ * For some data transfers, additional parameters should be set using the transfer property list. The
+ * table below lists the categories of transfer properties. These properties set parameters for the
+ * HDF5 Library and may be used to pass parameters for optional filters and file drivers. For
+ * example, transfer properties are used to select independent or collective operation when using
+ * MPI-I/O.
+ *
+ * <table>
+ * <caption>Categories of transfer properties</caption>
+ * <tr>
+ * <th>Properties</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Library parameters</td>
+ * <td>Internal caches, buffers, B-Trees, etc.</td>
+ * </tr>
+ * <tr>
+ * <td>Memory management</td>
+ * <td>Variable-length memory management, data overwrite</td>
+ * </tr>
+ * <tr>
+ * <td>File driver management</td>
+ * <td>Parameters for file drivers</td>
+ * </tr>
+ * <tr>
+ * <td>Filter management</td>
+ * <td>Parameters for filters</td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Data Transfer Operation (Read or Write)</h4>
+ * The data transfer is done by calling #H5Dread or #H5Dwrite with the parameters described above.
+ * The HDF5 Library constructs the required pipeline, which will scatter-gather, transform
+ * datatypes, apply the requested filters, and use the correct file driver.
+ *
+ * During the data transfer, the transformations and filters are applied to each element of the data in
+ * the required order until all the data is transferred.
+ *
+ * <h4>Summary</h4>
+ * To perform a data transfer, it is necessary to allocate and initialize memory, describe the source
+ * and destination, set required and optional transfer properties, and call the \ref H5D API.
+ *
+ * <h4>Examples</h4>
+ * The basic procedure to write to a dataset is the following:
+ * \li Open the dataset.
+ * \li Set the dataset dataspace for the write (optional if dataspace is #H5S_ALL).
+ * \li Write data.
+ * \li Close the datatype, dataspace, and property list (as necessary).
+ * \li Close the dataset.
+ *
+ * Example 3 below shows example code to write a 4 x 6 array of integers. In the example, the data
+ * is initialized in the memory array dset_data. The dataset has already been created in the file, so it
+ * is opened with H5Dopen.
+ *
+ * The data is written with #H5Dwrite. The arguments are the dataset identifier, the memory
+ * datatype (#H5T_NATIVE_INT), the memory and file selections (#H5S_ALL in this case: the
+ * whole array), and the default (empty) property list. The last argument is the data to be
+ * transferred.
+ *
+ * <em> Example 3. Write an array of integers</em>
+ * \code
+ * hid_t file_id, dataset_id; // identifiers
+ * herr_t status;
+ * int i, j, dset_data[4][6];
+ *
+ * // Initialize the dataset.
+ * for (i = 0; i < 4; i++)
+ * for (j = 0; j < 6; j++)
+ * dset_data[i][j] = i * 6 + j + 1;
+ *
+ * // Open an existing file.
+ * file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
+ *
+ * // Open an existing dataset.
+ * dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
+ *
+ * // Write the entire dataset, using 'dset_data': memory type is 'native int'
+ * // write the entire dataspace to the entire dataspace, no transfer properties
+ * status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+ *
+ * status = H5Dclose(dataset_id);
+ * \endcode
+ *
+ * Example 4 below shows a similar write except for setting a non-default value for the transfer
+ * buffer. The code is the same as Example 3, but a transfer property list is created, and the desired
+ * buffer size is set. The #H5Dwrite function has the same arguments, but uses the property list to set
+ * the buffer.
+ *
+ * <em> Example 4. Write an array using a property list</em>
+ * \code
+ * hid_t file_id, dataset_id;
+ * hid_t xferplist;
+ * herr_t status;
+ * int i, j, dset_data[4][6];
+ *
+ * file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
+ * dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
+ *
+ * // Example: set type conversion buffer to 64MB
+ * xferplist = H5Pcreate(H5P_DATASET_XFER);
+ * status = H5Pset_buffer( xferplist, 64 * 1024 *1024, NULL, NULL);
+ *
+ * // Write the entire dataset, using 'dset_data': memory type is 'native int'
+ * write the entire dataspace to the entire dataspace, set the buffer size with the property list
+ * status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xferplist, dset_data);
+ *
+ * status = H5Dclose(dataset_id);
+ * \endcode
+ *
+ * The basic procedure to read from a dataset is the following:
+ * \li Define the memory dataspace of the read (optional if dataspace is #H5S_ALL).
+ * \li Open the dataset.
+ * \li Get the dataset dataspace (if using #H5S_ALL above).
+ *
+ * Else define dataset dataspace of read.
+ * \li Define the memory datatype (optional).
+ * \li Define the memory buffer.
+ * \li Open the dataset.
+ * \li Read data.
+ * \li Close the datatype, dataspace, and property list (as necessary).
+ * \li Close the dataset.
+ *
+ * The example below shows code that reads a 4 x 6 array of integers from a dataset called “dset1”.
+ * First, the dataset is opened. The #H5Dread call has parameters:
+ * \li The dataset identifier (from #H5Dopen)
+ * \li The memory datatype (#H5T_NATIVE_INT)
+ * \li The memory and file dataspace (#H5S_ALL, the whole array)
+ * \li A default (empty) property list
+ * \li The memory to be filled
+ *
+ * <em> Example 5. Read an array from a dataset</em>
+ * \code
+ * hid_t file_id, dataset_id;
+ * herr_t status;
+ * int i, j, dset_data[4][6];
+ *
+ * // Open an existing file.
+ * file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
+ *
+ * // Open an existing dataset.
+ * dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
+ *
+ * // read the entire dataset, into 'dset_data': memory type is 'native int'
+ * // read the entire dataspace to the entire dataspace, no transfer properties,
+ * status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+ *
+ * status = H5Dclose(dataset_id);
+ * \endcode
+ *
+ * \subsubsection subsubsec_dataset_program_read Retrieve the Properties of a Dataset
+ * The functions listed below allow the user to retrieve information regarding a dataset including
+ * the datatype, the dataspace, the dataset creation property list, and the total stored size of the data.
+ *
+ * <table>
+ * <caption>Retrieve dataset information</caption>
+ * <tr>
+ * <th>Query Function</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>H5Dget_space</td>
+ * <td>Retrieve the dataspace of the dataset as stored in the file.</td>
+ * </tr>
+ * <tr>
+ * <td>H5Dget_type</td>
+ * <td>Retrieve the datatype of the dataset as stored in the file.</td>
+ * </tr>
+ * <tr>
+ * <td>H5Dget_create_plist</td>
+ * <td>Retrieve the dataset creation properties.</td>
+ * </tr>
+ * <tr>
+ * <td>H5Dget_storage_size</td>
+ * <td>Retrieve the total bytes for all the data of the dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>H5Dvlen_get_buf_size</td>
+ * <td>Retrieve the total bytes for all the variable-length data of the dataset.</td>
+ * </tr>
+ * </table>
+ *
+ * The example below illustrates how to retrieve dataset information.
+ *
+ * <em> Example 6. Retrieve dataset</em>
+ * \code
+ * hid_t file_id, dataset_id;
+ * hid_t dspace_id, dtype_id, plist_id;
+ * herr_t status;
+ *
+ * // Open an existing file.
+ * file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
+ *
+ * // Open an existing dataset.
+ * dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
+ * dspace_id = H5Dget_space(dataset_id);
+ * dtype_id = H5Dget_type(dataset_id);
+ * plist_id = H5Dget_create_plist(dataset_id);
+ *
+ * // use the objects to discover the properties of the dataset
+ * status = H5Dclose(dataset_id);
+ * \endcode
+ *
+ * \subsection subsec_dataset_transfer Data Transfer
+ * The HDF5 library implements data transfers through a pipeline which implements data
+ * transformations (according to the datatype and selections), chunking (as requested), and I/O
+ * operations using different mechanisms (file drivers). The pipeline is automatically configured by
+ * the HDF5 library. Metadata is stored in the file so that the correct pipeline can be constructed to
+ * retrieve the data. In addition, optional filters such as compression may be added to the standard
+ * pipeline.
+ *
+ * The figure below illustrates data layouts for different layers of an application using HDF5. The
+ * application data is organized as a multidimensional array of elements. The HDF5 format
+ * specification defines the stored layout of the data and metadata. The storage layout properties
+ * define the organization of the abstract data. This data is written to and read from some storage
+ * medium.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig4.gif "Data layouts in an application"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The last stage of a write (and first stage of a read) is managed by an HDF5 file driver module.
+ * The virtual file layer of the HDF5 Library implements a standard interface to alternative I/O
+ * methods, including memory (AKA “core”) files, single serial file I/O, multiple file I/O, and
+ * parallel I/O. The file driver maps a simple abstract HDF5 file to the specific access methods.
+ *
+ * The raw data of an HDF5 dataset is conceived to be a multidimensional array of data elements.
+ * This array may be stored in the file according to several storage strategies:
+ * \li Contiguous
+ * \li Chunked
+ * \li Compact
+ *
+ * The storage strategy does not affect data access methods except that certain operations may be
+ * more or less efficient depending on the storage strategy and the access patterns.
+ *
+ * Overall, the data transfer operations (#H5Dread and #H5Dwrite) work identically for any storage
+ * method, for any file driver, and for any filters and transformations. The HDF5 library
+ * automatically manages the data transfer process. In some cases, transfer properties should or
+ * must be used to pass additional parameters such as MPI/IO directives when using the parallel file
+ * driver.
+ *
+ * \subsubsection subsubsec_dataset_transfer_pipe The Data Pipeline
+ * When data is written or read to or from an HDF5 file, the HDF5 library passes the data through a
+ * sequence of processing steps which are known as the HDF5 data pipeline. This data pipeline
+ * performs operations on the data in memory such as byte swapping, alignment, scatter-gather, and
+ * hyperslab selections. The HDF5 library automatically determines which operations are needed
+ * and manages the organization of memory operations such as extracting selected elements from a
+ * data block. The data pipeline modules operate on data buffers: each module processes a buffer
+ * and passes the transformed buffer to the next stage.
+ *
+ * The table below lists the stages of the data pipeline. The figure below the table shows the order
+ * of processing during a read or write.
+ *
+ * <table>
+ * <caption>Stages of the data pipeline</caption>
+ * <tr>
+ * <th>Layers</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>I/O initiation</td>
+ * <td>Initiation of HDF5 I/O activities (#H5Dwrite and #H5Dread) in a user’s application program.</td>
+ * </tr>
+ * <tr>
+ * <td>Memory hyperslab operation</td>
+ * <td>Data is scattered to (for read), or gathered from (for write) the application’s memory buffer
+ * (bypassed if no datatype conversion is needed).</td>
+ * </tr>
+ * <tr>
+ * <td>Datatype conversion</td>
+ * <td>Datatype is converted if it is different between memory and storage (bypassed if no datatype
+ * conversion is needed).</td>
+ * </tr>
+ * <tr>
+ * <td>File hyperslab operation</td>
+ * <td>Data is gathered from (for read), or scattered to (for write) to file space in memory (bypassed
+ * if no datatype conversion is needed).</td>
+ * </tr>
+ * <tr>
+ * <td>Filter pipeline</td>
+ * <td>Data is processed by filters when it passes. Data can be modified and restored here (bypassed
+ * if no datatype conversion is needed, no filter is enabled, or dataset is not chunked).</td>
+ * </tr>
+ * <tr>
+ * <td>Virtual File Layer</td>
+ * <td>Facilitate easy plug-in file drivers such as MPIO or POSIX I/O.</td>
+ * </tr>
+ * <tr>
+ * <td>Actual I/O</td>
+ * <td>Actual file driver used by the library such as MPIO or STDIO.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig5.gif "The processing order in the data pipeline"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The HDF5 library automatically applies the stages as needed.
+ *
+ * When the memory dataspace selection is other than the whole dataspace, the memory hyperslab
+ * stage scatters/gathers the data elements between the application memory (described by the
+ * selection) and a contiguous memory buffer for the pipeline. On a write, this is a gather operation;
+ * on a read, this is a scatter operation.
+ *
+ * When the memory datatype is different from the file datatype, the datatype conversion stage
+ * transforms each data element. For example, if data is written from 32-bit big-endian memory,
+ * and the file datatype is 32-bit little-endian, the datatype conversion stage will swap the bytes of
+ * every element. Similarly, when data is read from the file to native memory, byte swapping will
+ * be applied automatically when needed.
+ *
+ * The file hyperslab stage is similar to the memory hyperslab stage, but is managing the
+ * arrangement of the elements according to the dataspace selection. When data is read, data
+ * elements are gathered from the data blocks from the file to fill the contiguous buffers which are
+ * then processed by the pipeline. When data is read, the elements from a buffer are scattered to the
+ * data blocks of the file.
+ *
+ * \subsubsection subsubsec_dataset_transfer_filter Data Pipeline Filters
+ * In addition to the standard pipeline, optional stages, called filters, can be inserted in the pipeline.
+ * The standard distribution includes optional filters to implement compression and error checking.
+ * User applications may add custom filters as well.
+ *
+ * The HDF5 library distribution includes or employs several optional filters. These are listed in the
+ * table below. The filters are applied in the pipeline between the virtual file layer and the file
+ * hyperslab operation. See the figure above. The application can use any number of filters in any
+ * order.
+ *
+ * <table>
+ * <caption>Data pipeline filters</caption>
+ * <tr>
+ * <th>Filter</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>gzip compression</td>
+ * <td>Data compression using zlib.</td>
+ * </tr>
+ * <tr>
+ * <td>Szip compression</td>
+ * <td>Data compression using the Szip library. See The HDF Group website for more information
+ * regarding the Szip filter.</td>
+ * </tr>
+ * <tr>
+ * <td>N-bit compression</td>
+ * <td>Data compression using an algorithm specialized for n-bit datatypes.</td>
+ * </tr>
+ * <tr>
+ * <td>Scale-offset compression</td>
+ * <td>Data compression using a “scale and offset” algorithm.</td>
+ * </tr>
+ * <tr>
+ * <td>Shuffling</td>
+ * <td>To improve compression performance, data is regrouped by its byte position in the data
+ * unit. In other words, the 1st, 2nd, 3rd, and 4th bytes of integers are stored together
+ * respectively.</td>
+ * </tr>
+ * <tr>
+ * <td>Fletcher32</td>
+ * <td>Fletcher32 checksum for error-detection.</td>
+ * </tr>
+ * </table>
+ *
+ * Filters may be used only for chunked data and are applied to chunks of data between the file
+ * hyperslab stage and the virtual file layer. At this stage in the pipeline, the data is organized as
+ * fixed-size blocks of elements, and the filter stage processes each chunk separately.
+ *
+ * Filters are selected by dataset creation properties, and some behavior may be controlled by data
+ * transfer properties. The library determines what filters must be applied and applies them in the
+ * order in which they were set by the application. That is, if an application calls
+ * #H5Pset_shuffle and then #H5Pset_deflate when creating a dataset’s creation property list, the
+ * library will apply the shuffle filter first and then the deflate filter.
+ *
+ * For more information,
+ * \li @see @ref subsubsec_dataset_filters_nbit
+ * \li @see @ref subsubsec_dataset_filters_scale
+ *
+ * \subsubsection subsubsec_dataset_transfer_drive File Drivers
+ * I/O is performed by the HDF5 virtual file layer. The file driver interface writes and reads blocks
+ * of data; each driver module implements the interface using different I/O mechanisms. The table
+ * below lists the file drivers currently supported. Note that the I/O mechanisms are separated from
+ * the pipeline processing: the pipeline and filter operations are identical no matter what data access
+ * mechanism is used.
+ *
+ * <table>
+ * <caption>I/O file drivers</caption>
+ * <tr>
+ * <th>File Driver</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>#H5FD_CORE</td>
+ * <td>Store in memory (optional backing store to disk file).</td>
+ * </tr>
+ * <tr>
+ * <td>#H5FD_FAMILY</td>
+ * <td>Store in a set of files.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5FD_LOG</td>
+ * <td>Store in logging file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5FD_MPIO</td>
+ * <td>Store using MPI/IO.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5FD_MULTI</td>
+ * <td>Store in multiple files. There are several options to control layout.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5FD_SEC2</td>
+ * <td>Serial I/O to file using Unix “section 2” functions.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5FD_STDIO</td>
+ * <td>Serial I/O to file using Unix “stdio” functions.</td>
+ * </tr>
+ * </table>
+ *
+ * Each file driver writes/reads contiguous blocks of bytes from a logically contiguous address
+ * space. The file driver is responsible for managing the details of the different physical storage
+ * methods.
+ *
+ * In serial environments, everything above the virtual file layer tends to work identically no matter
+ * what storage method is used.
+ *
+ * Some options may have substantially different performance depending on the file driver that is
+ * used. In particular, multi-file and parallel I/O may perform considerably differently from serial
+ * drivers depending on chunking and other settings.
+ *
+ * \subsubsection subsubsec_dataset_transfer_props Data Transfer Properties to Manage the Pipeline
+ * Data transfer properties set optional parameters that control parts of the data pipeline. The
+ * function listing below shows transfer properties that control the behavior of the library.
+ *
+ * <table>
+ * <caption>Data transfer property list functions</caption>
+ * <tr>
+ * <th>C Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_buffer</td>
+ * <td>Maximum size for the type conversion buffer and the background buffer. May also supply
+ * pointers to application-allocated buffers.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_hyper_vector_size</td>
+ * <td>set the number of "I/O vectors" (offset and length pairs) which are to be
+ * accumulated in memory before being issued to the lower levels
+ * of the library for reading or writing the actual data.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_btree_ratios</td>
+ * <td>Set the B-tree split ratios for a dataset transfer property list. The split ratios determine
+ * what percent of children go in the first node when a node splits.</td>
+ * </tr>
+ * </table>
+ *
+ * Some filters and file drivers require or use additional parameters from the application program.
+ * These can be passed in the data transfer property list. The table below shows file driver property
+ * list functions.
+ *
+ * <table>
+ * <caption>File driver property list functions</caption>
+ * <tr>
+ * <th>C Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_dxpl_mpio</td>
+ * <td>Control the MPI I/O transfer mode (independent or collective) during data I/O operations.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_small_data_block_size</td>
+ * <td>Reserves blocks of size bytes for the contiguous storage of the raw data portion of small
+ * datasets. The HDF5 Library then writes the raw data from small datasets to this reserved space
+ * which reduces unnecessary discontinuities within blocks of metadata and improves
+ * I/O performance.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_edc_check</td>
+ * <td>Disable/enable EDC checking for read. When selected, EDC is always written.</td>
+ * </tr>
+ * </table>
+ *
+ * The transfer properties are set in a property list which is passed as a parameter of the #H5Dread or
+ * #H5Dwrite call. The transfer properties are passed to each pipeline stage. Each stage may use or
+ * ignore any property in the list. In short, there is one property list that contains all the properties.
+ *
+ * \subsubsection subsubsec_dataset_transfer_store Storage Strategies
+ * The raw data is conceptually a multi-dimensional array of elements that is stored as a contiguous
+ * array of bytes. The data may be physically stored in the file in several ways. The table below lists
+ * the storage strategies for a dataset.
+ *
+ * <table>
+ * <caption> Dataset storage strategies</caption>
+ * <tr>
+ * <th>Storage Strategy</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Contiguous</td>
+ * <td>The dataset is stored as one continuous array of bytes.</td>
+ * </tr>
+ * <tr>
+ * <td>Chunked </td>
+ * <td>The dataset is stored as fixed-size chunks.</td>
+ * </tr>
+ * <tr>
+ * <td>Compact</td>
+ * <td>A small dataset is stored in the metadata header.</td>
+ * </tr>
+ * </table>
+ *
+ * The different storage strategies do not affect the data transfer operations of the dataset: reads and
+ * writes work the same for any storage strategy.
+ *
+ * These strategies are described in the following sections.
+ *
+ * <h4>Contiguous</h4>
+ * A contiguous dataset is stored in the file as a header and a single continuous array of bytes. See
+ * the figure below. In the case of a multi-dimensional array, the data is serialized in row major order. By
+ * default, data is stored contiguously.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig6.gif "Contiguous data storage"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Contiguous storage is the simplest model. It has several limitations. First, the dataset must be a
+ * fixed-size: it is not possible to extend the limit of the dataset or to have unlimited dimensions. In
+ * other words, if the number of dimensions of the array might change over time, then chunking
+ * storage must be used instead of contiguous. Second, because data is passed through the pipeline
+ * as fixed-size blocks, compression and other filters cannot be used with contiguous data.
+ *
+ * <h4>Chunked</h4>
+ * The data of a dataset may be stored as fixed-size chunks. A chunk is a hyper-
+ * rectangle of any shape. When a dataset is chunked, each chunk is read or written as a single I/O
+ * operation, and individually passed from stage to stage of the data pipeline.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig7.gif "Chunked data storage"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Chunks may be any size and shape that fits in the dataspace of the dataset. For example, a three
+ * dimensional dataspace can be chunked as 3-D cubes, 2-D planes, or 1-D lines. The chunks may
+ * extend beyond the size of the dataspace. For example, a 3 x 3 dataset might by chunked in 2 x 2
+ * chunks. Sufficient chunks will be allocated to store the array, and any extra space will not be
+ * accessible. So, to store the 3 x 3 array, four 2 x 2 chunks would be allocated with 5 unused
+ * elements stored.
+ *
+ * Chunked datasets can be unlimited in any direction and can be compressed or filtered.
+ *
+ * Since the data is read or written by chunks, chunking can have a dramatic effect on performance
+ * by optimizing what is read and written. Note, too, that for specific access patterns such as
+ * parallel I/O, decomposition into chunks can have a large impact on performance.
+ *
+ * Two restrictions have been placed on chunk shape and size:
+ * <ul><li> The rank of a chunk must be less than or equal to the rank of the dataset</li>
+ * <li> Chunk size cannot exceed the size of a fixed-size dataset; for example, a dataset consisting of
+ * a 5 x 4 fixed-size array cannot be defined with 10 x 10 chunks</li></ul>
+ *
+ * <h4>Compact</h4>
+ * For contiguous and chunked storage, the dataset header information and data are stored in two
+ * (or more) blocks. Therefore, at least two I/O operations are required to access the data: one to
+ * access the header, and one (or more) to access data. For a small dataset, this is considerable
+ * overhead.
+ *
+ * A small dataset may be stored in a continuous array of bytes in the header block using the
+ * compact storage option. This dataset can be read entirely in one operation which retrieves the
+ * header and data. The dataset must fit in the header. This may vary depending on the metadata
+ * that is stored. In general, a compact dataset should be approximately 30 KB or less total size.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig8.gif "Compact data storage"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_dataset_transfer_partial Partial I/O Sub‐setting and Hyperslabs
+ * Data transfers can write or read some of the data elements of the dataset. This is controlled by
+ * specifying two selections: one for the source and one for the destination. Selections are specified
+ * by creating a dataspace with selections.
+ *
+ * Selections may be a union of hyperslabs or a list of points. A hyperslab is a contiguous hyper-
+ * rectangle from the dataspace. Selected fields of a compound datatype may be read or written. In
+ * this case, the selection is controlled by the memory and file datatypes.
+ *
+ * Summary of procedure:
+ * \li 1. Open the dataset
+ * \li 2. Define the memory datatype
+ * \li 3. Define the memory dataspace selection and file dataspace selection
+ * \li 4. Transfer data (#H5Dread or #H5Dwrite)
+ *
+ * For more information,
+ * @see @ref sec_dataspace
+ *
+ * \subsection subsec_dataset_allocation Allocation of Space in the File
+ * When a dataset is created, space is allocated in the file for its header and initial data. The amount
+of space allocated when the dataset is created depends on the storage properties. When the
+dataset is modified (data is written, attributes added, or other changes), additional storage may be
+allocated if necessary.
+ *
+ * <table>
+ * <caption>Initial dataset size</caption>
+ * <tr>
+ * <th>Object</th>
+ * <th>Size</th>
+ * </tr>
+ * <tr>
+ * <td>Header</td>
+ * <td>Variable, but typically around 256 bytes at the creation of a simple dataset with a simple
+ * datatype.</td>
+ * </tr>
+ * <tr>
+ * <td>Data</td>
+ * <td>Size of the data array (number of elements x size of element). Space allocated in
+ * the file depends on the storage strategy and the allocation strategy.</td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Header</h4>
+ * A dataset header consists of one or more header messages containing persistent metadata
+ * describing various aspects of the dataset. These records are defined in the HDF5 File Format
+ * Specification. The amount of storage required for the metadata depends on the metadata to be
+ * stored. The table below summarizes the metadata.
+ *
+ * <table>
+ * <caption>Metadata storage sizes</caption>
+ * <tr>
+ * <th>Header Information</th>
+ * <th>Approximate Storage Size</th>
+ * </tr>
+ * <tr>
+ * <td>Datatype (required)</td>
+ * <td>Bytes or more. Depends on type.</td>
+ * </tr>
+ * <tr>
+ * <td>Dataspace (required)</td>
+ * <td>Bytes or more. Depends on number of dimensions and hsize_t.</td>
+ * </tr>
+ * <tr>
+ * <td>Layout (required)</td>
+ * <td>Points to the stored data. Bytes or more. Depends on hsize_t and number of dimensions.</td>
+ * </tr>
+ * <tr>
+ * <td>Filters</td>
+ * <td>Depends on the number of filters. The size of the filter message depends on the name and
+ * data that will be passed.</td>
+ * </tr>
+ * </table>
+ *
+ * The header blocks also store the name and values of attributes, so the total storage depends on
+ * the number and size of the attributes.
+ *
+ * In addition, the dataset must have at least one link, including a name, which is stored in the file
+ * and in the group it is linked from.
+ *
+ * The different storage strategies determine when and how much space is allocated for the data
+ * array. See the discussion of fill values below for a detailed explanation of the storage allocation.
+ *
+ * <h4>Contiguous Storage</h4>
+ * For a continuous storage option, the data is stored in a single, contiguous block in the file. The
+ * data is nominally a fixed-size, (number of elements x size of element). The figure below shows
+ * an example of a two dimensional array stored as a contiguous dataset.
+ *
+ * Depending on the fill value properties, the space may be allocated when the dataset is created or
+ * when first written (default), and filled with fill values if specified. For parallel I/O, by default the
+ * space is allocated when the dataset is created.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig9.gif "A two dimensional array stored as a contiguous dataset"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Chunked Storage</h4>
+ * For chunked storage, the data is stored in one or more chunks. Each chunk is a continuous block
+ * in the file, but chunks are not necessarily stored contiguously. Each chunk has the same size. The
+ * data array has the same nominal size as a contiguous array (number of elements x size of
+ * element), but the storage is allocated in chunks, so the total size in the file can be larger than the
+ * nominal size of the array. See the figure below.
+ *
+ * If a fill value is defined, each chunk will be filled with the fill value. Chunks must be allocated
+ * when data is written, but they may be allocated when the file is created, as the file expands, or
+ * when data is written.
+ *
+ * For serial I/O, by default chunks are allocated incrementally, as data is written to the chunk. For
+ * a sparse dataset, chunks are allocated only for the parts of the dataset that are written. In this
+ * case, if the dataset is extended, no storage is allocated.
+ *
+ * For parallel I/O, by default chunks are allocated when the dataset is created or extended with fill
+ * values written to the chunk.
+ *
+ * In either case, the default can be changed using fill value properties. For example, using serial
+ * I/O, the properties can select to allocate chunks when the dataset is created.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig10.gif "A two dimensional array stored in chunks"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Changing Dataset Dimensions</h4>
+ * #H5Dset_extent is used to change the current dimensions of the dataset within the limits of the
+ * dataspace. Each dimension can be extended up to its maximum or unlimited. Extending the
+ * dataspace may or may not allocate space in the file and may or may not write fill values, if they
+ * are defined. See the example code below.
+ *
+ * The dimensions of the dataset can also be reduced. If the sizes specified are smaller than the
+ * dataset’s current dimension sizes, #H5Dset_extent will reduce the dataset’s dimension sizes to the
+ * specified values. It is the user’s responsibility to ensure that valuable data is not lost;
+ * #H5Dset_extent does not check.
+ *
+ * <em>Using #H5Dset_extent to increase the size of a dataset</em>
+ * \code
+ * hid_t file_id, dataset_id;
+ * herr_t status;
+ * size_t newdims[2];
+ *
+ * // Open an existing file.
+ * file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
+ *
+ * // Open an existing dataset.
+ * dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
+ *
+ * // Example: dataset is 2 x 3, each dimension is UNLIMITED
+ * // extend to 2 x 7
+ * newdims[0] = 2;
+ * newdims[1] = 7;
+ * status = H5Dset_extent(dataset_id, newdims);
+ *
+ * // dataset is now 2 x 7
+ *
+ * status = H5Dclose(dataset_id);
+ * \endcode
+ *
+ * \subsubsection subsubsec_dataset_allocation_store Storage Allocation in the File: Early, Incremental, Late
+ * The HDF5 Library implements several strategies for when storage is allocated if and when it is
+ * filled with fill values for elements not yet written by the user. Different strategies are
+ * recommended for different storage layouts and file drivers. In particular, a parallel program
+ * needs storage allocated during a collective call (for example, create or extend), while serial
+ * programs may benefit from delaying the allocation until the data is written.
+ *
+ * Two file creation properties control when to allocate space, when to write the fill value, and the
+ * actual fill value to write.
+ *
+ * <h4>When to Allocate Space</h4>
+ * The table below shows the options for when data is allocated in the file. Early allocation is done
+ * during the dataset create call. Certain file drivers (especially MPI-I/O and MPI-POSIX) require
+ * space to be allocated when a dataset is created, so all processors will have the correct view of the
+ * data.
+ *
+ * <table>
+ * <caption>File storage allocation options</caption>
+ * <tr>
+ * <th>Strategy</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Early</td>
+ * <td>Allocate storage for the dataset immediately when the dataset is created.</td>
+ * </tr>
+ * <tr>
+ * <td>Late</td>
+ * <td>Defer allocating space for storing the dataset until the dataset is written.</td>
+ * </tr>
+ * <tr>
+ * <td>Incremental</td>
+ * <td>Defer allocating space for storing each chunk until the chunk is written.</td>
+ * </tr>
+ * <tr>
+ * <td>Default</td>
+ * <td>Use the strategy (Early, Late, or Incremental) for the storage method and
+ * access method. This is the recommended strategy.</td>
+ * </tr>
+ * </table>
+ *
+ * Late allocation is done at the time of the first write to dataset. Space for the whole dataset is
+ * allocated at the first write.
+ *
+ * Incremental allocation (chunks only) is done at the time of the first write to the chunk. Chunks
+ * that have never been written are not allocated in the file. In a sparsely populated dataset, this
+ * option allocates chunks only where data is actually written.
+ *
+ * The “Default” property selects the option recommended as appropriate for the storage method
+ * and access method. The defaults are shown in the table below. Note that Early allocation is
+ * recommended for all Parallel I/O, while other options are recommended as the default for serial
+ * I/O cases.
+ *
+ * <table>
+ * <caption>Default storage options</caption>
+ * <tr>
+ * <th>Storage Type</th>
+ * <th>Serial I/O</th>
+ * <th>Parallel I/O</th>
+ * </tr>
+ * <tr>
+ * <td>Contiguous</td>
+ * <td>Late</td>
+ * <td>Early</td>
+ * </tr>
+ * <tr>
+ * <td>Chunked</td>
+ * <td>Incremental</td>
+ * <td>Early</td>
+ * </tr>
+ * <tr>
+ * <td>Compact</td>
+ * <td>Early</td>
+ * <td>Early</td>
+ * </tr>
+ * </table>
+ *
+ * <h4>When to Write the Fill Value</h4>
+ * The second property is when to write the fill value. The possible values are “Never” and
+ * “Allocation”. The table below shows these options.
+ *
+ * <table>
+ * <caption>When to write fill values</caption>
+ * <tr>
+ * <th>When</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Never</td>
+ * <td>Fill value will never be written.</td>
+ * </tr>
+ * <tr>
+ * <td>Allocation</td>
+ * <td>Fill value is written when space is allocated. (Default for chunked and contiguous
+ * data storage.)</td>
+ * </tr>
+ * </table>
+ *
+ * <h4>What Fill Value to Write</h4>
+ * The third property is the fill value to write. The table below shows the values. By default, the
+ * data is filled with zeros. The application may choose no fill value (Undefined). In this case,
+ * uninitialized data may have random values. The application may define a fill value of an
+ * appropriate type. For more information, @see @ref subsec_datatype_fill.
+ *
+ * <table>
+ * <caption>Fill values to write</caption>
+ * <tr>
+ * <th>What to Write</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>Default</td>
+ * <td>By default, the library fills allocated space with zeros.</td>
+ * </tr>
+ * <tr>
+ * <td>Undefined</td>
+ * <td>Allocated space is filled with random values.</td>
+ * </tr>
+ * <tr>
+ * <td>User-defined</td>
+ * <td>The application specifies the fill value.</td>
+ * </tr>
+ * </table>
+ *
+ * Together these three properties control the library’s behavior. The table below summarizes the
+ * possibilities during the dataset create-write-close cycle.
+ *
+ * <table>
+ * <caption>Storage allocation and fill summary</caption>
+ * <tr>
+ * <th>When to allocate space</th>
+ * <th>When to write fill value</th>
+ * <th>What fill value to write</th>
+ * <th>Library create-write-close behavior</th>
+ * </tr>
+ * <tr>
+ * <td>Early</td>
+ * <td>Never</td>
+ * <td>-</td>
+ * <td>Library allocates space when dataset is created, but never writes a fill value to dataset. A read
+ * of unwritten data returns undefined values.</td>
+ * </tr>
+ * <tr>
+ * <td>Late</td>
+ * <td>Never</td>
+ * <td>-</td>
+ * <td>Library allocates space when dataset is written to, but never writes a fill value to the dataset. A
+ * read of unwritten data returns undefined values.</td>
+ * </tr>
+ * <tr>
+ * <td>Incremental</td>
+ * <td>Never</td>
+ * <td>-</td>
+ * <td>Library allocates space when a dataset or chunk (whichever is the smallest unit of space)
+ * is written to, but it never writes a fill value to a dataset or a chunk. A read of unwritten data
+ * returns undefined values.</td>
+ * </tr>
+ * <tr>
+ * <td>-</td>
+ * <td>Allocation</td>
+ * <td>Undefined</td>
+ * <td>Error on creating the dataset. The dataset is not created.</td>
+ * </tr>
+ * <tr>
+ * <td>Early</td>
+ * <td>Allocation</td>
+ * <td>Default or User-defined</td>
+ * <td>Allocate space for the dataset when the dataset is created. Write the fill value (default or
+ * user-defined) to the entire dataset when the dataset is created.</td>
+ * </tr>
+ * <tr>
+ * <td>Late</td>
+ * <td>Allocation</td>
+ * <td>Default or User-define</td>
+ * <td>Allocate space for the dataset when the application first writes data values to the dataset.
+ * Write the fill value to the entire dataset before writing application data values.</td>
+ * </tr>
+ * <tr>
+ * <td>Incremental</td>
+ * <td>Allocation</td>
+ * <td>Default or User-define</td>
+ * <td>Allocate space for the dataset when the application first writes data values to the dataset or
+ * chunk (whichever is the smallest unit of space). Write the fill value to the entire dataset
+ * or chunk before writing application data values.</td>
+ * </tr>
+ * </table>
+ *
+ * During the #H5Dread function call, the library behavior depends on whether space has been
+ * allocated, whether the fill value has been written to storage, how the fill value is defined, and
+ * when to write the fill value. The table below summarizes the different behaviors.
+ *
+ * <table>
+ * <caption>H5Dread summary</caption>
+ * <tr>
+ * <th>Is space allocated in the file?</th>
+ * <th>What is the fill value?</th>
+ * <th>When to write the fill value?</th>
+ * <th>Library read behavior</th>
+ * </tr>
+ * <tr>
+ * <td>No</td>
+ * <td>Undefined</td>
+ * <td>anytime</td>
+ * <td>Error. Cannot create this dataset.</td>
+ * </tr>
+ * <tr>
+ * <td>No</td>
+ * <td>Default or User-define</td>
+ * <td>anytime</td>
+ * <td>Fill the memory buffer with the fill value.</td>
+ * </tr>
+ * <tr>
+ * <td>Yes</td>
+ * <td>Undefined</td>
+ * <td>anytime</td>
+ * <td>Return data from storage (dataset). Trash is possible if the application has not written data
+ * to the portion of the dataset being read.</td>
+ * </tr>
+ * <tr>
+ * <td>Yes</td>
+ * <td>Default or User-define</td>
+ * <td>Never</td>
+ * <td>Return data from storage (dataset). Trash is possible if the application has not written data
+ * to the portion of the dataset being read.</td>
+ * </tr>
+ * <tr>
+ * <td>Yes</td>
+ * <td>Default or User-define</td>
+ * <td>Allocation</td>
+ * <td>Return data from storage (dataset).</td>
+ * </tr>
+ * </table>
+ *
+ * There are two cases to consider depending on whether the space in the file has been allocated
+ * before the read or not. When space has not yet been allocated and if a fill value is defined, the
+ * memory buffer will be filled with the fill values and returned. In other words, no data has been
+ * read from the disk. If space has been allocated, the values are returned from the stored data. The
+ * unwritten elements will be filled according to the fill value.
+ *
+ * \subsubsection subsubsec_dataset_allocation_delete Deleting a Dataset from a File and Reclaiming Space
+ * HDF5 does not at this time provide an easy mechanism to remove a dataset from a file or to
+ * reclaim the storage space occupied by a deleted object.
+ *
+ * Removing a dataset and reclaiming the space it used can be done with the #H5Ldelete function
+ * and the h5repack utility program. With the H5Ldelete function, links to a dataset can be removed
+ * from the file structure. After all the links have been removed, the dataset becomes inaccessible to
+ * any application and is effectively removed from the file. The way to recover the space occupied
+ * by an unlinked dataset is to write all of the objects of the file into a new file. Any unlinked object
+ * is inaccessible to the application and will not be included in the new file. Writing objects to a
+ * new file can be done with a custom program or with the h5repack utility program.
+ *
+ * For more information, @see @ref sec_group
+ *
+ * \subsubsection subsubsec_dataset_allocation_release Releasing Memory Resources
+ * The system resources required for HDF5 objects such as datasets, datatypes, and dataspaces
+ * should be released once access to the object is no longer needed. This is accomplished via the
+ * appropriate close function. This is not unique to datasets but a general requirement when
+ * working with the HDF5 Library; failure to close objects will result in resource leaks.
+ *
+ * In the case where a dataset is created or data has been transferred, there are several objects that
+ * must be closed. These objects include datasets, datatypes, dataspaces, and property lists.
+ *
+ * The application program must free any memory variables and buffers it allocates. When
+ * accessing data from the file, the amount of memory required can be determined by calculating
+ * the size of the memory datatype and the number of elements in the memory selection.
+ *
+ * Variable-length data are organized in two or more areas of memory. For more information,
+ * \see \ref h4_vlen_datatype "Variable-length Datatypes".
+ *
+ * When writing data, the application creates an array of
+ * vl_info_t which contains pointers to the elements. The elements might be, for example, strings.
+ * In the file, the variable-length data is stored in two parts: a heap with the variable-length values
+ * of the data elements and an array of vl_info_t elements. When the data is read, the amount of
+ * memory required for the heap can be determined with the #H5Dvlen_get_buf_size call.
+ *
+ * The data transfer property may be used to set a custom memory manager for allocating variable-
+ * length data for a #H5Dread. This is set with the #H5Pset_vlen_mem_manager call.
+ * To free the memory for variable-length data, it is necessary to visit each element, free the
+ * variable-length data, and reset the element. The application must free the memory it has
+ * allocated. For memory allocated by the HDF5 Library during a read, the #H5Dvlen_reclaim
+ * function can be used to perform this operation.
+ *
+ * \subsubsection subsubsec_dataset_allocation_ext External Storage Properties
+ * The external storage format allows data to be stored across a set of non-HDF5 files. A set of
+ * segments (offsets and sizes) in one or more files is defined as an external file list, or EFL, and
+ * the contiguous logical addresses of the data storage are mapped onto these segments. Currently,
+ * only the #H5D_CONTIGUOUS storage format allows external storage. External storage is
+ * enabled by a dataset creation property. The table below shows the API.
+ *
+ * <table>
+ * <caption>External storage API</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_external</td>
+ * <td>This function adds a new segment to the end of the external file list of the specified dataset
+ * creation property list. The segment begins a byte offset of file name and continues for size
+ * bytes. The space represented by this segment is adjacent to the space already represented by
+ * the external file list. The last segment in a file list may have the size #H5F_UNLIMITED, in
+ * which case the external file may be of unlimited size and no more files can be added to the
+ * external files list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_external_count</td>
+ * <td>Calling this function returns the number of segments in an external file list. If the dataset
+ * creation property list has no external data, then zero is returned.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_external</td>
+ * <td>This is the counterpart for the #H5Pset_external function. Given a dataset creation
+ * property list and a zero-based index into that list, the file name, byte offset, and segment
+ * size are returned through non-null arguments. At most name_size characters are copied into
+ * the name argument which is not null terminated if the file name is longer than the
+ * supplied name buffer (this is similar to strncpy()).</td>
+ * </tr>
+ * </table>
+ *
+ * The figure below shows an example of how a contiguous, one-dimensional dataset is partitioned
+ * into three parts and each of those parts is stored in a segment of an external file. The top
+ * rectangle represents the logical address space of the dataset while the bottom rectangle represents
+ * an external file.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig11.gif "External file storage"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The example below shows code that defines the external storage for the example. Note that the
+ * segments are defined in order of the logical addresses they represent, not their order within the
+ * external file. It would also have been possible to put the segments in separate files. Care should
+ * be taken when setting up segments in a single file since the library does not automatically check
+ * for segments that overlap.
+ *
+ * <em>External storage</em>
+ * \code
+ * plist = H5Pcreate (H5P_DATASET_CREATE);
+ * H5Pset_external (plist, "velocity.data", 3000, 1000);
+ * H5Pset_external (plist, "velocity.data", 0, 2500);
+ * H5Pset_external (plist, "velocity.data", 4500, 1500);
+ * \endcode
+ *
+ * The figure below shows an example of how a contiguous, two-dimensional dataset is partitioned
+ * into three parts and each of those parts is stored in a separate external file. The top rectangle
+ * represents the logical address space of the dataset while the bottom rectangles represent external
+ * files.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_fig12.gif "Partitioning a 2-D dataset for external storage"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The example below shows code for the partitioning described above. In this example, the library
+ * maps the multi-dimensional array onto a linear address space as defined by the HDF5 format
+ * specification, and then maps that address space into the segments defined in the external file list.
+ *
+ * <em>Partitioning a 2-D dataset for external storage</em>
+ * \code
+ * plist = H5Pcreate (H5P_DATASET_CREATE);
+ * H5Pset_external (plist, "scan1.data", 0, 24);
+ * H5Pset_external (plist, "scan2.data", 0, 24);
+ * H5Pset_external (plist, "scan3.data", 0, 16);
+ * \endcode
+ *
+ * The segments of an external file can exist beyond the end of the (external) file. The library reads
+ * that part of a segment as zeros. When writing to a segment that exists beyond the end of a file,
+ * the external file is automatically extended. Using this feature, one can create a segment (or set of
+ * segments) which is larger than the current size of the dataset. This allows the dataset to be
+ * extended at a future time (provided the dataspace also allows the extension).
+ *
+ * All referenced external data files must exist before performing raw data I/O on the dataset. This
+ * is normally not a problem since those files are being managed directly by the application or
+ * indirectly through some other library. However, if the file is transferred from its original context,
+ * care must be taken to assure that all the external files are accessible in the new location.
+ *
+ * \subsection subsec_dataset_filters Using HDF5 Filters
+ * This section describes in detail how to use the n-bit, scale-offset filters and szip filters.
+ *
+ * \subsubsection subsubsec_dataset_filters_nbit Using the N‐bit Filter
+ * N-bit data has n significant bits, where n may not correspond to a precise number of bytes. On
+ * the other hand, computing systems and applications universally, or nearly so, run most efficiently
+ * when manipulating data as whole bytes or multiple bytes.
+ *
+ * Consider the case of 12-bit integer data. In memory, that data will be handled in at least 2 bytes,
+ * or 16 bits, and on some platforms in 4 or even 8 bytes. The size of such a dataset can be
+ * significantly reduced when written to disk if the unused bits are stripped out.
+ *
+ * The n-bit filter is provided for this purpose, packing n-bit data on output by stripping off all
+ * unused bits and unpacking on input, restoring the extra bits required by the computational
+ * processor.
+ *
+ * <h4>N-bit Datatype</h4>
+ * An n-bit datatype is a datatype of n significant bits. Unless it is packed, an n-bit datatype is
+ * presented as an n-bit bitfield within a larger-sized value. For example, a 12-bit datatype might be
+ * presented as a 12-bit field in a 16-bit, or 2-byte, value.
+ *
+ * Currently, the datatype classes of n-bit datatype or n-bit field of a compound datatype or an array
+ * datatype are limited to integer or floating-point.
+ *
+ * The HDF5 user can create an n-bit datatype through a series of function calls. For example, the
+ * following calls create a 16-bit datatype that is stored in a 32-bit value with a 4-bit offset:
+ * \code
+ * hid_t nbit_datatype = H5Tcopy(H5T_STD_I32LE);
+ * H5Tset_precision(nbit_datatype, 16);
+ * H5Tset_offset(nbit_datatype, 4);
+ * \endcode
+ *
+ * In memory, one value of the above example n-bit datatype would be stored on a little-endian
+ * machine as follows:
+ * <table>
+ * <tr>
+ * <th>byte 3</th>
+ * <th>byte 2</th>
+ * <th>byte 1</th>
+ * <th>byte 0</th>
+ * </tr>
+ * <tr>
+ * <td>????????</td>
+ * <td>????SPPP</td>
+ * <td>PPPPPPPP</td>
+ * <td>PPPP????</td>
+ * </tr>
+ * <tr>
+ * <td colspan="4">
+ * <em>Note: Key: S - sign bit, E - exponent bit, M - mantissa bit, ? - padding bit. Sign bit is
+ * included in signed integer datatype precision.</em>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>N-bit Filter</h4>
+ * When data of an n-bit datatype is stored on disk using the n-bit filter, the filter packs the data by
+ * stripping off the padding bits; only the significant bits are retained and stored. The values on disk
+ * will appear as follows:
+ * <table>
+ * <tr>
+ * <th>1st value</th>
+ * <th>2nd value</th>
+ * <th>nth value</th>
+ * </tr>
+ * <tr>
+ * <td>SPPPPPPP PPPPPPPP</td>
+ * <td>SPPPPPPP PPPPPPPP</td>
+ * <td>...</td>
+ * </tr>
+ * <tr>
+ * <td colspan="3">
+ * <em>Note: Key: S - sign bit, E - exponent bit, M - mantissa bit, ? - padding bit. Sign bit is
+ * included in signed integer datatype precision.</em>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>How Does the N-bit Filter Work?</h4>
+ * The n-bit filter always compresses and decompresses according to dataset properties supplied by
+ * the HDF5 library in the datatype, dataspace, or dataset creation property list.
+ *
+ * The dataset datatype refers to how data is stored in an HDF5 file while the memory datatype
+ * refers to how data is stored in memory. The HDF5 library will do datatype conversion when
+ * writing data in memory to the dataset or reading data from the dataset to memory if the memory
+ * datatype differs from the dataset datatype. Datatype conversion is performed by HDF5 library
+ * before n-bit compression and after n-bit decompression.
+ *
+ * The following sub-sections examine the common cases:
+ * \li N-bit integer conversions
+ * \li N-bit floating-point conversions
+ *
+ * <h4>N-bit Integer Conversions</h4>
+ * Integer data with a dataset of integer datatype of less than full precision and a memory datatype
+ * of #H5T_NATIVE_INT, provides the simplest application of the n-bit filter.
+ *
+ * The precision of #H5T_NATIVE_INT is 8 multiplied by sizeof(int). This value, the size of an
+ * int in bytes, differs from platform to platform; we assume a value of 4 for the following
+ * illustration. We further assume the memory byte order to be little-endian.
+ *
+ * In memory, therefore, the precision of #H5T_NATIVE_INT is 32 and the offset is 0. One value of
+ * #H5T_NATIVE_INT is laid out in memory as follows:
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_NbitInteger1.gif "H5T_NATIVE_INT in memory"<br />
+ * <em>Note: Key: S - sign bit, E - exponent bit, M - mantissa bit, ? - padding bit. Sign bit is
+ * included in signed integer datatype precision.</em>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Suppose the dataset datatype has a precision of 16 and an offset of 4. After HDF5 converts
+ * values from the memory datatype to the dataset datatype, it passes something like the following
+ * to the n-bit filter for compression:
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_NbitInteger2.gif "Passed to the n-bit filter"<br />
+ * <em>Note: Key: S - sign bit, E - exponent bit, M - mantissa bit, ? - padding bit. Sign bit is
+ * included in signed integer datatype precision.</em>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Notice that only the specified 16 bits (15 significant bits and the sign bit) are retained in the
+ * conversion. All other significant bits of the memory datatype are discarded because the dataset
+ * datatype calls for only 16 bits of precision. After n-bit compression, none of these discarded bits,
+ * known as padding bits will be stored on disk.
+ *
+ * <h4>N-bit Floating-point Conversions</h4>
+ * Things get more complicated in the case of a floating-point dataset datatype class. This sub-
+ * section provides an example that illustrates the conversion from a memory datatype of
+ * #H5T_NATIVE_FLOAT to a dataset datatype of class floating-point.
+ *
+ * As before, let the #H5T_NATIVE_FLOAT be 4 bytes long, and let the memory byte order be
+ * little-endian. Per the IEEE standard, one value of #H5T_NATIVE_FLOAT is laid out in memory
+ * as follows:
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_NbitFloating1.gif "H5T_NATIVE_FLOAT in memory"<br />
+ * <em>Note: Key: S - sign bit, E - exponent bit, M - mantissa bit, ? - padding bit. Sign bit is
+ * included in floating-point datatype precision.</em>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Suppose the dataset datatype has a precision of 20, offset of 7, mantissa size of 13, mantissa
+ * position of 7, exponent size of 6, exponent position of 20, and sign position of 26. For more
+ * information, @see @ref subsubsec_datatype_program_define.
+ *
+ * After HDF5 converts values from the memory datatype to the dataset datatype, it passes
+ * something like the following to the n-bit filter for compression:
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dsets_NbitFloating2.gif "Passed to the n-bit filter"<br />
+ * <em>Note: Key: S - sign bit, E - exponent bit, M - mantissa bit, ? - padding bit. Sign bit is
+ * included in floating-point datatype precision.</em>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The sign bit and truncated mantissa bits are not changed during datatype conversion by the
+ * HDF5 library. On the other hand, the conversion of the 8-bit exponent to a 6-bit exponent is a
+ * little tricky:
+ *
+ * The bias for the new exponent in the n-bit datatype is:
+ * <code>
+ * 2<sup>(n-1)</sup>-1
+ * </code>
+ *
+ * The following formula is used for this exponent conversion:<br />
+ * <code>
+ * exp8 - (2<sup>(8-1)</sup> -1) = exp6 - (2<sup>(6-1)</sup>-1) = actual exponent value
+ * </code><br />
+ * where exp8 is the stored decimal value as represented by the 8-bit exponent, and exp6 is the
+ * stored decimal value as represented by the 6-bit exponent.
+ *
+ * In this example, caution must be taken to ensure that, after conversion, the actual exponent value
+ * is within the range that can be represented by a 6-bit exponent. For example, an 8-bit exponent
+ * can represent values from -127 to 128 while a 6-bit exponent can represent values only from -31
+ * to 32.
+ *
+ * <h4>N-bit Filter Behavior</h4>
+ * The n-bit filter was designed to treat the incoming data byte by byte at the lowest level. The
+ * purpose was to make the n-bit filter as generic as possible so that no pointer cast related to the
+ * datatype is needed.
+ *
+ * Bitwise operations are employed for packing and unpacking at the byte level.
+ *
+ * Recursive function calls are used to treat compound and array datatypes.
+ *
+ * <h4>N-bit Compression</h4>
+ * The main idea of n-bit compression is to use a loop to compress each data element in a chunk.
+ * Depending on the datatype of each element, the n-bit filter will call one of four functions. Each
+ * of these functions performs one of the following tasks:
+ * \li Compress a data element of a no-op datatype
+ * \li Compress a data element of an atomic datatype
+ * \li Compress a data element of a compound datatype
+ * \li Compress a data element of an array datatype
+ *
+ * No-op datatypes: The n-bit filter does not actually compress no-op datatypes. Rather, it copies
+ * the data buffer of the no-op datatype from the non-compressed buffer to the proper location in
+ * the compressed buffer; the compressed buffer has no holes. The term “compress” is used here
+ * simply to distinguish this function from the function that performs the reverse operation during
+ * decompression.
+ *
+ * Atomic datatypes: The n-bit filter will find the bytes where significant bits are located and try to
+ * compress these bytes, one byte at a time, using a loop. At this level, the filter needs the following
+ * information:
+ * <ul><li>The byte offset of the beginning of the current data element with respect to the
+ * beginning of the input data buffer</li>
+ * <li>Datatype size, precision, offset, and byte order</li></ul>
+ *
+ * The n-bit filter compresses from the most significant byte containing significant bits to the least
+ * significant byte. For big-endian data, therefore, the loop index progresses from smaller to larger
+ * while for little-endian, the loop index progresses from larger to smaller.
+ *
+ * In the extreme case of when the n-bit datatype has full precision, this function copies the content
+ * of the entire non-compressed datatype to the compressed output buffer.
+ *
+ * Compound datatypes: The n-bit filter will compress each data member of the compound
+ * datatype. If the member datatype is of an integer or floating-point datatype, the n-bit filter will
+ * call the function described above. If the member datatype is of a no-op datatype, the filter will
+ * call the function described above. If the member datatype is of a compound datatype, the filter
+ * will make a recursive call to itself. If the member datatype is of an array datatype, the filter will
+ * call the function described below.
+ *
+ * Array datatypes: The n-bit filter will use a loop to compress each array element in the array. If
+ * the base datatype of array element is of an integer or floating-point datatype, the n-bit filter will
+ * call the function described above. If the base datatype is of a no-op datatype, the filter will call
+ * the function described above. If the base datatype is of a compound datatype, the filter will call
+ * the function described above. If the member datatype is of an array datatype, the filter will make
+ * a recursive call of itself.
+ *
+ * <h4>N-bit Decompression</h4>
+ * The n-bit decompression algorithm is very similar to n-bit compression. The only difference is
+ * that at the byte level, compression packs out all padding bits and stores only significant bits into
+ * a continuous buffer (unsigned char) while decompression unpacks significant bits and inserts
+ * padding bits (zeros) at the proper positions to recover the data bytes as they existed before
+ * compression.
+ *
+ * <h4>Storing N-bit Parameters to Array cd_value[]</h4>
+ * All of the information, or parameters, required by the n-bit filter are gathered and stored in the
+ * array cd_values[] by the private function H5Z__set_local_nbit and are passed to another private
+ * function, H5Z__filter_nbit, by the HDF5 Library.
+ * These parameters are as follows:
+ * \li Parameters related to the datatype
+ * \li The number of elements within the chunk
+ * \li A flag indicating whether compression is needed
+ *
+ * The first and second parameters can be obtained using the HDF5 dataspace and datatype
+ * interface calls.
+ *
+ * A compound datatype can have members of array or compound datatype. An array datatype’s
+ * base datatype can be a complex compound datatype. Recursive calls are required to set
+ * parameters for these complex situations.
+ *
+ * Before setting the parameters, the number of parameters should be calculated to dynamically
+ * allocate the array cd_values[], which will be passed to the HDF5 Library. This also requires
+ * recursive calls.
+ *
+ * For an atomic datatype (integer or floating-point), parameters that will be stored include the
+ * datatype’s size, endianness, precision, and offset.
+ *
+ * For a no-op datatype, only the size is required.
+ *
+ * For a compound datatype, parameters that will be stored include the datatype’s total size and
+ * number of members. For each member, its member offset needs to be stored. Other parameters
+ * for members will depend on the respective datatype class.
+ *
+ * For an array datatype, the total size parameter should be stored. Other parameters for the array’s
+ * base type depend on the base type’s datatype class.
+ *
+ * Further, to correctly retrieve the parameter for use of n-bit compression or decompression later,
+ * parameters for distinguishing between datatype classes should be stored.
+ *
+ * <h4>Implementation</h4>
+ * Three filter callback functions were written for the n-bit filter:
+ * \li H5Z__can_apply_nbit
+ * \li H5Z__set_local_nbit
+ * \li H5Z__filter_nbit
+ *
+ * These functions are called internally by the HDF5 library. A number of utility functions were
+ * written for the function H5Z__set_local_nbit. Compression and decompression functions were
+ * written and are called by function H5Z__filter_nbit. All these functions are included in the file
+ * H5Znbit.c.
+ *
+ * The public function #H5Pset_nbit is called by the application to set up the use of the n-bit filter.
+ * This function is included in the file H5Pdcpl.c. The application does not need to supply any
+ * parameters.
+ *
+ * <h4>How N-bit Parameters are Stored</h4>
+ * A scheme of storing parameters required by the n-bit filter in the array cd_values[] was
+ * developed utilizing recursive function calls.
+ *
+ * Four private utility functions were written for storing the parameters associated with atomic
+ * (integer or floating-point), no-op, array, and compound datatypes:
+ * \li H5Z__set_parms_atomic
+ * \li H5Z__set_parms_array
+ * \li H5Z__set_parms_nooptype
+ * \li H5Z__set_parms_compound
+ *
+ * The scheme is briefly described below.
+ *
+ * First, assign a numeric code for datatype class atomic (integer or float), no-op, array, and
+ * compound datatype. The code is stored before other datatype related parameters are stored.
+ *
+ * The first three parameters of cd_values[] are reserved for:
+ * \li 1. The number of valid entries in the array cd_values[]
+ * \li 2. A flag indicating whether compression is needed
+ * \li 3. The number of elements in the chunk
+ *
+ * Throughout the balance of this explanation, i represents the index of cd_values[].
+ * In the function H5Z__set_local_nbit:
+ * <ul><li>1. i = 2</li>
+ * <li>2. Get the number of elements in the chunk and store in cd_value[i]; increment i</li>
+ * <li>3. Get the class of the datatype:
+ * <ul><li>For an integer or floating-point datatype, call H5Z__set_parms_atomic</li>
+ * <li>For an array datatype, call H5Z__set_parms_array</li>
+ * <li>For a compound datatype, call H5Z__set_parms_compound</li>
+ * <li>For none of the above, call H5Z__set_parms_noopdatatype</li></ul></li>
+ * <li>4. Store i in cd_value[0] and flag in cd_values[1]</li></ul>
+ *
+ * In the function H5Z__set_parms_atomic:
+ * \li 1. Store the assigned numeric code for the atomic datatype in cd_value[i]; increment i
+ * \li 2. Get the size of the atomic datatype and store in cd_value[i]; increment i
+ * \li 3. Get the order of the atomic datatype and store in cd_value[i]; increment i
+ * \li 4. Get the precision of the atomic datatype and store in cd_value[i]; increment i
+ * \li 5. Get the offset of the atomic datatype and store in cd_value[i]; increment i
+ * \li 6. Determine the need to do compression at this point
+ *
+ * In the function H5Z__set_parms_nooptype:
+ * \li 1. Store the assigned numeric code for the no-op datatype in cd_value[i]; increment i
+ * \li 2. Get the size of the no-op datatype and store in cd_value[i]; increment i
+ *
+ * In the function H5Z__set_parms_array:
+ * <ul><li>1. Store the assigned numeric code for the array datatype in cd_value[i]; increment i</li>
+ * <li>2. Get the size of the array datatype and store in cd_value[i]; increment i</li>
+ * <li>3. Get the class of the array’s base datatype.
+ * <ul><li>For an integer or floating-point datatype, call H5Z__set_parms_atomic</li>
+ * <li>For an array datatype, call H5Z__set_parms_array</li>
+ * <li>For a compound datatype, call H5Z__set_parms_compound</li>
+ * <li>If none of the above, call H5Z__set_parms_noopdatatype</li></ul></li></ul>
+ *
+ * In the function H5Z__set_parms_compound:
+ * <ul><li>1. Store the assigned numeric code for the compound datatype in cd_value[i]; increment i</li>
+ * <li>2. Get the size of the compound datatype and store in cd_value[i]; increment i</li>
+ * <li>3. Get the number of members and store in cd_values[i]; increment i</li>
+ * <li>4. For each member
+ * <ul><li>Get the member offset and store in cd_values[i]; increment i</li>
+ * <li>Get the class of the member datatype</li>
+ * <li>For an integer or floating-point datatype, call H5Z__set_parms_atomic</li>
+ * <li>For an array datatype, call H5Z__set_parms_array</li>
+ * <li>For a compound datatype, call H5Z__set_parms_compound</li>
+ * <li>If none of the above, call H5Z__set_parms_noopdatatype</li></ul></li></ul>
+ *
+ * <h4>N-bit Compression and Decompression Functions</h4>
+ * The n-bit compression and decompression functions above are called by the private HDF5
+ * function H5Z__filter_nbit. The compress and decompress functions retrieve the n-bit parameters
+ * from cd_values[] as it was passed by H5Z__filter_nbit. Parameters are retrieved in exactly the
+ * same order in which they are stored and lower-level compression and decompression functions
+ * for different datatype classes are called.
+ *
+ * N-bit compression is not implemented in place. Due to the difficulty of calculating actual output
+ * buffer size after compression, the same space as that of the input buffer is allocated for the output
+ * buffer as passed to the compression function. However, the size of the output buffer passed by
+ * reference to the compression function will be changed (smaller) after the compression is
+ * complete.
+ *
+ * <h4>Usage Examples</h4>
+ *
+ * The following code example illustrates the use of the n-bit filter for writing and reading n-bit
+ * integer data.
+ *
+ * <em>N-bit compression for integer data</em>
+ * \code
+ * #include "hdf5.h"
+ * #include "stdlib.h"
+ * #include "math.h"
+ *
+ * #define H5FILE_NAME "nbit_test_int.h5"
+ * #define DATASET_NAME "nbit_int"
+ * #define NX 200
+ * #define NY 300
+ * #define CH_NX 10
+ * #define CH_NY 15
+ *
+ * int main(void)
+ * {
+ * hid_t file, dataspace, dataset, datatype, mem_datatype, dset_create_props;
+ * hsize_t dims[2], chunk_size[2];
+ * int orig_data[NX][NY];
+ * int new_data[NX][NY];
+ * int i, j;
+ * size_t precision, offset;
+ *
+ * // Define dataset datatype (integer), and set precision, offset
+ * datatype = H5Tcopy(H5T_NATIVE_INT);
+ * precision = 17; // precision includes sign bit
+ * if(H5Tset_precision(datatype,precision) < 0) {
+ * printf("Error: fail to set precision\n");
+ * return -1;
+ * }
+ * offset = 4;
+ * if(H5Tset_offset(datatype,offset) < 0) {
+ * printf("Error: fail to set offset\n");
+ * return -1;
+ * }
+ *
+ * // Copy to memory datatype
+ * mem_datatype = H5Tcopy(datatype);
+ *
+ * // Set order of dataset datatype
+ * if(H5Tset_order(datatype, H5T_ORDER_BE) < 0) {
+ * printf("Error: fail to set endianness\n");
+ * return -1;
+ * }
+ *
+ * // Initialize data buffer with random data within correct
+ * // range corresponding to the memory datatype's precision
+ * // and offset.
+ * for (i = 0; i < NX; i++)
+ * for (j = 0; j < NY; j++)
+ * orig_data[i][j] = rand() % (int)pow(2, precision-1) << offset;
+ *
+ * // Describe the size of the array.
+ * dims[0] = NX;
+ * dims[1] = NY;
+ * if((dataspace = H5Screate_simple (2, dims, NULL)) < 0) {
+ * printf("Error: fail to create dataspace\n");
+ * return -1;
+ * }
+ *
+ * // Create a new file using read/write access, default file
+ * // creation properties, and default file access properties.
+ * if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create file\n");
+ * return -1;
+ * }
+ *
+ * // Set the dataset creation property list to specify that
+ * // the raw data is to be partitioned into 10 x 15 element
+ * // chunks and that each chunk is to be compressed.
+ * chunk_size[0] = CH_NX;
+ * chunk_size[1] = CH_NY;
+ * if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE)) < 0) {
+ * printf("Error: fail to create dataset property\n");
+ * return -1;
+ * }
+ * if(H5Pset_chunk (dset_create_props, 2, chunk_size) < 0) {
+ * printf("Error: fail to set chunk\n");
+ * return -1;
+ * }
+ *
+ * // Set parameters for n-bit compression; check the description
+ * // of the H5Pset_nbit function in the HDF5 Reference Manual
+ * // for more information.
+ * if(H5Pset_nbit (dset_create_props) < 0) {
+ * printf("Error: fail to set nbit filter\n");
+ * return -1;
+ * }
+ *
+ * // Create a new dataset within the file. The datatype
+ * // and dataspace describe the data on disk, which may
+ * // be different from the format used in the application's
+ * // memory.
+ * if((dataset = H5Dcreate(file, DATASET_NAME, datatype, dataspace,
+ * H5P_DEFAULT, dset_create_props, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create dataset\n");
+ * return -1;
+ * }
+ *
+ * // Write the array to the file. The datatype and dataspace
+ * // describe the format of the data in the 'orig_data' buffer.
+ * // The raw data is translated to the format required on disk,
+ * // as defined above. We use default raw data transfer
+ * // properties.
+ * if(H5Dwrite (dataset, mem_datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0) {
+ * printf("Error: fail to write to dataset\n");
+ * return -1;
+ * }
+ * H5Dclose (dataset);
+ *
+ * if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to open dataset\n");
+ * return -1;
+ * }
+ *
+ * // Read the array. This is similar to writing data,
+ * // except the data flows in the opposite direction.
+ * // Note: Decompression is automatic.
+ * if(H5Dread (dataset, mem_datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0) {
+ * printf("Error: fail to read from dataset\n");
+ * return -1;
+ * }
+ *
+ * H5Tclose (datatype);
+ * H5Tclose (mem_datatype);
+ * H5Dclose (dataset);
+ * H5Sclose (dataspace);
+ * H5Pclose (dset_create_props);
+ * H5Fclose (file);
+ *
+ * return 0;
+ * }
+ * \endcode
+ *
+ * The following code example illustrates the use of the n-bit filter for writing and reading n-bit
+ * floating-point data.
+ *
+ * <em>N-bit compression for floating-point data</em>
+ * \code
+ * #include "hdf5.h"
+ *
+ * #define H5FILE_NAME "nbit_test_float.h5"
+ * #define DATASET_NAME "nbit_float"
+ * #define NX 2
+ * #define NY 5
+ * #define CH_NX 2
+ * #define CH_NY 5
+ *
+ * int main(void)
+ * {
+ * hid_t file, dataspace, dataset, datatype, dset_create_props;
+ * hsize_t dims[2], chunk_size[2];
+ *
+ * // orig_data[] are initialized to be within the range that
+ * // can be represented by dataset datatype (no precision
+ * // loss during datatype conversion)
+ * //
+ * float orig_data[NX][NY] = {{188384.00, 19.103516,-1.0831790e9, -84.242188, 5.2045898},
+ * {-49140.000, 2350.2500, -3.2110596e-1, 6.4998865e-5, -0.0000000}};
+ * float new_data[NX][NY];
+ * size_t precision, offset;
+ *
+ * // Define single-precision floating-point type for dataset
+ * //---------------------------------------------------------------
+ * // size=4 byte, precision=20 bits, offset=7 bits,
+ * // mantissa size=13 bits, mantissa position=7,
+ * // exponent size=6 bits, exponent position=20,
+ * // exponent bias=31.
+ * // It can be illustrated in little-endian order as:
+ * // (S - sign bit, E - exponent bit, M - mantissa bit, ? - padding bit)
+ * //
+ * // 3 2 1 0
+ * // ?????SEE EEEEMMMM MMMMMMMM M???????
+ * //
+ * // To create a new floating-point type, the following
+ * // properties must be set in the order of
+ * // set fields -> set offset -> set precision -> set size.
+ * // All these properties must be set before the type can
+ * // function. Other properties can be set anytime. Derived
+ * // type size cannot be expanded bigger than original size
+ * // but can be decreased. There should be no holes
+ * // among the significant bits. Exponent bias usually
+ * // is set 2^(n-1)-1, where n is the exponent size.
+ * //---------------------------------------------------------------
+ * datatype = H5Tcopy(H5T_IEEE_F32BE);
+ * if(H5Tset_fields(datatype, 26, 20, 6, 7, 13) < 0) {
+ * printf("Error: fail to set fields\n");
+ * return -1;
+ * }
+ * offset = 7;
+ * if(H5Tset_offset(datatype,offset) < 0) {
+ * printf("Error: fail to set offset\n");
+ * return -1;
+ * }
+ * precision = 20;
+ * if(H5Tset_precision(datatype,precision) < 0) {
+ * printf("Error: fail to set precision\n");
+ * return -1;
+ * }
+ * if(H5Tset_size(datatype, 4) < 0) {
+ * printf("Error: fail to set size\n");
+ * return -1;
+ * }
+ * if(H5Tset_ebias(datatype, 31) < 0) {
+ * printf("Error: fail to set exponent bias\n");
+ * return -1;
+ * }
+ *
+ * // Describe the size of the array.
+ * dims[0] = NX;
+ * dims[1] = NY;
+ * if((dataspace = H5Screate_simple (2, dims, NULL)) < 0) {
+ * printf("Error: fail to create dataspace\n");
+ * return -1;
+ * }
+ *
+ * // Create a new file using read/write access, default file
+ * // creation properties, and default file access properties.
+ * if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create file\n");
+ * return -1;
+ * }
+ *
+ * // Set the dataset creation property list to specify that
+ * // the raw data is to be partitioned into 2 x 5 element
+ * // chunks and that each chunk is to be compressed.
+ * chunk_size[0] = CH_NX;
+ * chunk_size[1] = CH_NY;
+ * if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE)) < 0) {
+ * printf("Error: fail to create dataset property\n");
+ * return -1;
+ * }
+ * if(H5Pset_chunk (dset_create_props, 2, chunk_size) < 0) {
+ * printf("Error: fail to set chunk\n");
+ * return -1;
+ * }
+ *
+ * // Set parameters for n-bit compression; check the description
+ * // of the H5Pset_nbit function in the HDF5 Reference Manual
+ * // for more information.
+ * if(H5Pset_nbit (dset_create_props) < 0) {
+ * printf("Error: fail to set nbit filter\n");
+ * return -1;
+ * }
+ *
+ * // Create a new dataset within the file. The datatype
+ * // and dataspace describe the data on disk, which may
+ * // be different from the format used in the application's memory.
+ * if((dataset = H5Dcreate(file, DATASET_NAME, datatype, dataspace, H5P_DEFAULT,
+ * dset_create_plists, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create dataset\n");
+ * return -1;
+ * }
+ *
+ * // Write the array to the file. The datatype and dataspace
+ * // describe the format of the data in the 'orig_data' buffer.
+ * // The raw data is translated to the format required on disk,
+ * // as defined above. We use default raw data transfer properties.
+ * if(H5Dwrite (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0) {
+ * printf("Error: fail to write to dataset\n");
+ * return -1;
+ * }
+ * H5Dclose (dataset);
+ * if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT))<0) {
+ * printf("Error: fail to open dataset\n");
+ * return -1;
+ * }
+ *
+ * // Read the array. This is similar to writing data,
+ * // except the data flows in the opposite direction.
+ * // Note: Decompression is automatic.
+ * if(H5Dread (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0) {
+ * printf("Error: fail to read from dataset\n");
+ * return -1;
+ * }
+ * H5Tclose (datatype);
+ * H5Dclose (dataset);
+ * H5Sclose (dataspace);
+ * H5Pclose (dset_create_props);
+ * H5Fclose (file);
+ *
+ * return 0
+ * }
+ * \endcode
+ *
+ * <h4>Limitations</h4>
+ * Because the array cd_values[] has to fit into an object header message of 64K, the n-bit filter has
+ * an upper limit on the number of n-bit parameters that can be stored in it. To be conservative, a
+ * maximum of 4K is allowed for the number of parameters.
+ *
+ * The n-bit filter currently only compresses n-bit datatypes or fields derived from integer or
+ * floating-point datatypes. The n-bit filter assumes padding bits of zero. This may not be true since
+ * the HDF5 user can set padding bit to be zero, one, or leave the background alone. However, it is
+ * expected the n-bit filter will be modified to adjust to such situations.
+ *
+ * The n-bit filter does not have a way to handle the situation where the fill value of a dataset is
+ * defined and the fill value is not of an n-bit datatype although the dataset datatype is.
+ *
+ * \subsubsection subsubsec_dataset_filters_scale Using the Scale‐offset Filter
+ * Generally speaking, scale-offset compression performs a scale and/or offset operation on each
+ * data value and truncates the resulting value to a minimum number of bits (minimum-bits) before
+ * storing it.
+ *
+ * The current scale-offset filter supports integer and floating-point datatypes only. For the floating-
+ * point datatype, float and double are supported, but long double is not supported.
+ *
+ * Integer data compression uses a straight-forward algorithm. Floating-point data compression
+ * adopts the GRiB data packing mechanism which offers two alternate methods: a fixed minimum-
+ * bits method, and a variable minimum-bits method. Currently, only the variable minimum-bits
+ * method is implemented.
+ *
+ * Like other I/O filters supported by the HDF5 library, applications using the scale-offset filter
+ * must store data with chunked storage.
+ *
+ * Integer type: The minimum-bits of integer data can be determined by the filter. For example, if
+ * the maximum value of data to be compressed is 7065 and the minimum value is 2970. Then the
+ * “span” of dataset values is equal to (max-min+1), which is 4676. If no fill value is defined for the
+ * dataset, the minimum-bits is: ceiling(log2(span)) = 12. With fill value set, the minimum-bits is:
+ * ceiling(log2(span+1)) = 13.
+ *
+ * HDF5 users can also set the minimum-bits. However, if the user gives a minimum-bits that is
+ * less than that calculated by the filter, the compression will be lossy.
+ *
+ * Floating-point type: The basic idea of the scale-offset filter for the floating-point type is to
+ * transform the data by some kind of scaling to integer data, and then to follow the procedure of
+ * the scale-offset filter for the integer type to do the data compression. Due to the data
+ * transformation from floating-point to integer, the scale-offset filter is lossy in nature.
+ *
+ * Two methods of scaling the floating-point data are used: the so-called D-scaling and E-scaling.
+ * D-scaling is more straightforward and easy to understand. For HDF5 1.8 release, only the
+ * D-scaling method had been implemented.
+ *
+ * <h4>Design</h4>
+ * Before the filter does any real work, it needs to gather some information from the HDF5 Library
+ * through API calls. The parameters the filter needs are:
+ * \li The minimum-bits of the data value
+ * \li The number of data elements in the chunk
+ * \li The datatype class, size, sign (only for integer type), byte order, and fill value if defined
+ *
+ * Size and sign are needed to determine what kind of pointer cast to use when retrieving values
+ * from the data buffer.
+ *
+ * The pipeline of the filter can be divided into four parts: (1)pre-compression; (2)compression;
+ * (3)decompression; (4)post-decompression.
+ *
+ * Depending on whether a fill value is defined or not, the filter will handle pre-compression and
+ * post-decompression differently.
+ *
+ * The scale-offset filter only needs the memory byte order, size of datatype, and minimum-bits for
+ * compression and decompression.
+ *
+ * Since decompression has no access to the original data, the minimum-bits and the minimum
+ * value need to be stored with the compressed data for decompression and post-decompression.
+ *
+ * <h4>Integer Type</h4>
+ * Pre-compression: During pre-compression minimum-bits is calculated if it is not set by the user.
+ * For more information on how minimum-bits are calculated, @see @ref subsubsec_dataset_filters_nbit.
+ *
+ * If the fill value is defined, finding the maximum and minimum values should ignore the data
+ * element whose value is equal to the fill value.
+ *
+ * If no fill value is defined, the value of each data element is subtracted by the minimum value
+ * during this stage.
+ *
+ * If the fill value is defined, the fill value is assigned to the maximum value. In this way minimum-
+ * bits can represent a data element whose value is equal to the fill value and subtracts the
+ * minimum value from a data element whose value is not equal to the fill value.
+ *
+ * The fill value (if defined), the number of elements in a chunk, the class of the datatype, the size
+ * of the datatype, the memory order of the datatype, and other similar elements will be stored in
+ * the HDF5 object header for the post-decompression usage.
+ *
+ * After pre-compression, all values are non-negative and are within the range that can be stored by
+ * minimum-bits.
+ *
+ * Compression: All modified data values after pre-compression are packed together into the
+ * compressed data buffer. The number of bits for each data value decreases from the number of
+ * bits of integer (32 for most platforms) to minimum-bits. The value of minimum-bits and the
+ * minimum value are added to the data buffer and the whole buffer is sent back to the library. In
+ * this way, the number of bits for each modified value is no more than the size of minimum-bits.
+ *
+ * Decompression: In this stage, the number of bits for each data value is resumed from minimum-
+ * bits to the number of bits of integer.
+ *
+ * Post-decompression: For the post-decompression stage, the filter does the opposite of what it
+ * does during pre-compression except that it does not calculate the minimum-bits or the minimum
+ * value. These values were saved during compression and can be retrieved through the resumed
+ * data buffer. If no fill value is defined, the filter adds the minimum value back to each data
+ * element.
+ *
+ * If the fill value is defined, the filter assigns the fill value to the data element whose value is equal
+ * to the maximum value that minimum-bits can represent and adds the minimum value back to
+ * each data element whose value is not equal to the maximum value that minimum-bits can
+ * represent.
+ *
+ * @anchor h4_float_datatype <h4>Floating-point Type</h4>
+ * The filter will do data transformation from floating-point type to integer type and then handle the
+ * data by using the procedure for handling the integer data inside the filter. Insignificant bits of
+ * floating-point data will be cut off during data transformation, so this filter is a lossy compression
+ * method.
+ *
+ * There are two scaling methods: D-scaling and E-scaling. The HDF5 1.8 release only supports D-
+ * scaling. D-scaling is short for decimal scaling. E-scaling should be similar conceptually. In order
+ * to transform data from floating-point to integer, a scale factor is introduced. The minimum value
+ * will be calculated. Each data element value will subtract the minimum value. The modified data
+ * will be multiplied by 10 (Decimal) to the power of scale_factor, and only the integer part will be
+ * kept and manipulated through the routines for the integer type of the filter during pre-
+ * compression and compression. Integer data will be divided by 10 to the power of scale_factor to
+ * transform back to floating-point data during decompression and post-decompression. Each data
+ * element value will then add the minimum value, and the floating-point data are resumed.
+ * However, the resumed data will lose some insignificant bits compared with the original value.
+ *
+ * For example, the following floating-point data are manipulated by the filter, and the D-scaling
+ * factor is 2.
+ * <em>{104.561, 99.459, 100.545, 105.644}</em>
+ *
+ * The minimum value is 99.459, each data element subtracts 99.459, the modified data is
+ * <em>{5.102, 0, 1.086, 6.185}</em>
+ *
+ * Since the D-scaling factor is 2, all floating-point data will be multiplied by 10^2 with this result:
+ * <em>{510.2, 0, 108.6, 618.5}</em>
+ *
+ * The digit after decimal point will be rounded off, and then the set looks like:
+ * <em>{510, 0, 109, 619}</em>
+ *
+ * After decompression, each value will be divided by 10^2 and will be added to the offset 99.459.
+ * The floating-point data becomes
+ * <em>{104.559, 99.459, 100.549, 105.649}</em>
+ *
+ * The relative error for each value should be no more than 5* (10^(D-scaling factor +1)).
+ * D-scaling sometimes is also referred as a variable minimum-bits method since for different datasets
+ * the minimum-bits to represent the same decimal precision will vary. The data value is modified
+ * to 2 to power of scale_factor for E-scaling. E-scaling is also called fixed-bits method since for
+ * different datasets the minimum-bits will always be fixed to the scale factor of E-scaling.
+ * Currently, HDF5 ONLY supports the D-scaling (variable minimum-bits) method.
+ *
+ * <h4>Implementation</h4>
+ * The scale-offset filter implementation was written and included in the file H5Zscaleoffset.c.
+ * Function #H5Pset_scaleoffset was written and included in the file “H5Pdcpl.c”. The HDF5 user
+ * can supply minimum-bits by calling function #H5Pset_scaleoffset.
+ *
+ * The scale-offset filter was implemented based on the design outlined in this section. However,
+ * the following factors need to be considered:
+ * <ol><li>
+ * The filter needs the appropriate cast pointer whenever it needs to retrieve data values.
+ * </li>
+ * <li>
+ * The HDF5 Library passes to the filter the to-be-compressed data in the format of the dataset
+ * datatype, and the filter passes back the decompressed data in the same format. If a fill value is
+ * defined, it is also in dataset datatype format. For example, if the byte order of the dataset data-
+ * type is different from that of the memory datatype of the platform, compression or decompression performs
+ * an endianness conversion of data buffer. Moreover, it should be aware that
+ * memory byte order can be different during compression and decompression.
+ * </li>
+ * <li>
+ * The difference of endianness and datatype between file and memory should be considered
+ * when saving and retrieval of minimum-bits, minimum value, and fill value.
+ * <li>
+ * If the user sets the minimum-bits to full precision of the datatype, no operation is needed at
+ * the filter side. If the full precision is a result of calculation by the filter, then the minimum-bits
+ * needs to be saved for decompression but no compression or decompression is needed (only a
+ * copy of the input buffer is needed).</li>
+ * <li>
+ * If by calculation of the filter, the minimum-bits is equal to zero, special handling is needed.
+ * Since it means all values are the same, no compression or decompression is needed. But the
+ * minimum-bits and minimum value still need to be saved during compression.</li>
+ * <li>
+ * For floating-point data, the minimum value of the dataset should be calculated at first. Each
+ * data element value will then subtract the minimum value to obtain the “offset” data. The offset
+ * data will then follow the steps outlined above in the discussion of floating-point types to do data
+ * transformation to integer and rounding. For more information, @see @ref h4_float_datatype.
+ * </li></ol>
+ *
+ * <h4>Usage Examples</h4>
+ * The following code example illustrates the use of the scale-offset filter for writing and reading
+ * integer data.
+ *
+ * <em>Scale-offset compression integer data</em>
+ * \code
+ * #include "hdf5.h"
+ * #include "stdlib.h"
+ *
+ * #define H5FILE_NAME "scaleoffset_test_int.h5"
+ * #define DATASET_NAME "scaleoffset_int"
+ * #define NX 200
+ * #define NY 300
+ * #define CH_NX 10
+ * #define CH_NY 15
+ * int main(void)
+ * {
+ * hid_t file, dataspace, dataset, datatype, dset_create_props;
+ * hsize_t dims[2], chunk_size[2];
+ * int orig_data[NX][NY];
+ * int new_data[NX][NY];
+ * int i, j, fill_val;
+ *
+ * // Define dataset datatype
+ * datatype = H5Tcopy(H5T_NATIVE_INT);
+ *
+ * // Initialize data buffer
+ * for (i=0; i < NX; i++)
+ * for (j=0; j < NY; j++)
+ * orig_data[i][j] = rand() % 10000;
+ *
+ * // Describe the size of the array.
+ * dims[0] = NX;
+ * dims[1] = NY;
+ * if((dataspace = H5Screate_simple (2, dims, NULL)) < 0) {
+ * printf("Error: fail to create dataspace\n");
+ * return -1;
+ * }
+ *
+ * // Create a new file using read/write access, default file
+ * // creation properties, and default file access properties.
+ * if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create file\n");
+ * return -1;
+ * }
+ *
+ * // Set the dataset creation property list to specify that
+ * // the raw data is to be partitioned into 10 x 15 element
+ * // chunks and that each chunk is to be compressed.
+ * chunk_size[0] = CH_NX;
+ * chunk_size[1] = CH_NY;
+ * if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE)) < 0) {
+ * printf("Error: fail to create dataset property\n");
+ * return -1;
+ * }
+ * if(H5Pset_chunk (dset_create_props, 2, chunk_size) < 0) {
+ * printf("Error: fail to set chunk\n");
+ * return -1;
+ * }
+ *
+ * // Set the fill value of dataset
+ * fill_val = 10000;
+ * if (H5Pset_fill_value(dset_create_props, H5T_NATIVE_INT, &fill_val)<0) {
+ * printf("Error: can not set fill value for dataset\n");
+ * return -1;
+ * }
+ *
+ * // Set parameters for scale-offset compression. Check the
+ * // description of the H5Pset_scaleoffset function in the
+ * // HDF5 Reference Manual for more information.
+ * if(H5Pset_scaleoffset (dset_create_props, H5Z_SO_INT, H5Z_SO_INT_MINIMUMBITS_DEFAULT) < 0) {
+ * printf("Error: fail to set scaleoffset filter\n");
+ * return -1;
+ * }
+ *
+ * // Create a new dataset within the file. The datatype
+ * // and dataspace describe the data on disk, which may
+ * // or may not be different from the format used in the
+ * // application's memory. The link creation and
+ * // dataset access property list parameters are passed
+ * // with default values.
+ * if((dataset = H5Dcreate (file, DATASET_NAME, datatype, dataspace, H5P_DEFAULT,
+ * dset_create_props, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create dataset\n");
+ * return -1;
+ * }
+ *
+ * // Write the array to the file. The datatype and dataspace
+ * // describe the format of the data in the 'orig_data' buffer.
+ * // We use default raw data transfer properties.
+ * if(H5Dwrite (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0) {
+ * printf("Error: fail to write to dataset\n");
+ * return -1;
+ * }
+ *
+ * H5Dclose (dataset);
+ *
+ * if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to open dataset\n");
+ * return -1;
+ * }
+ *
+ * // Read the array. This is similar to writing data,
+ * // except the data flows in the opposite direction.
+ * // Note: Decompression is automatic.
+ * if(H5Dread (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0) {
+ * printf("Error: fail to read from dataset\n");
+ * return -1;
+ * }
+ *
+ * H5Tclose (datatype);
+ * H5Dclose (dataset);
+ * H5Sclose (dataspace);
+ * H5Pclose (dset_create_props);
+ * H5Fclose (file);
+ *
+ * return 0;
+ * }
+ * \endcode
+ *
+ * The following code example illustrates the use of the scale-offset filter (set for variable
+ * minimum-bits method) for writing and reading floating-point data.
+ *
+ * <em>Scale-offset compression floating-point data</em>
+ * \code
+ * #include "hdf5.h"
+ * #include "stdlib.h"
+ *
+ * #define H5FILE_NAME "scaleoffset_test_float_Dscale.h5"
+ * #define DATASET_NAME "scaleoffset_float_Dscale"
+ * #define NX 200
+ * #define NY 300
+ * #define CH_NX 10
+ * #define CH_NY 15
+ *
+ * int main(void)
+ * {
+ * hid_t file, dataspace, dataset, datatype, dset_create_props;
+ * hsize_t dims[2], chunk_size[2];
+ * float orig_data[NX][NY];
+ * float new_data[NX][NY];
+ * float fill_val;
+ * int i, j;
+ *
+ * // Define dataset datatype
+ * datatype = H5Tcopy(H5T_NATIVE_FLOAT);
+ *
+ * // Initialize data buffer
+ * for (i=0; i < NX; i++)
+ * for (j=0; j < NY; j++)
+ * orig_data[i][j] = (rand() % 10000) / 1000.0;
+ *
+ * // Describe the size of the array.
+ * dims[0] = NX;
+ * dims[1] = NY;
+ * if((dataspace = H5Screate_simple (2, dims, NULL)) < 0) {
+ * printf("Error: fail to create dataspace\n");
+ * return -1;
+ * }
+ *
+ * // Create a new file using read/write access, default file
+ * // creation properties, and default file access properties.
+ * if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create file\n");
+ * return -1;
+ * }
+ *
+ * // Set the dataset creation property list to specify that
+ * // the raw data is to be partitioned into 10 x 15 element
+ * // chunks and that each chunk is to be compressed.
+ * chunk_size[0] = CH_NX;
+ * chunk_size[1] = CH_NY;
+ * if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE)) < 0) {
+ * printf("Error: fail to create dataset property\n");
+ * return -1;
+ * }
+ * if(H5Pset_chunk (dset_create_props, 2, chunk_size) < 0) {
+ * printf("Error: fail to set chunk\n");
+ * return -1;
+ * }
+ *
+ * // Set the fill value of dataset
+ * fill_val = 10000.0;
+ * if (H5Pset_fill_value(dset_create_props, H5T_NATIVE_FLOAT, &fill_val) < 0) {
+ * printf("Error: can not set fill value for dataset\n");
+ * return -1;
+ * }
+ *
+ * // Set parameters for scale-offset compression; use variable
+ * // minimum-bits method, set decimal scale factor to 3. Check
+ * // the description of the H5Pset_scaleoffset function in the
+ * // HDF5 Reference Manual for more information.
+ * if(H5Pset_scaleoffset (dset_create_props, H5Z_SO_FLOAT_DSCALE, 3) < 0) {
+ * printf("Error: fail to set scaleoffset filter\n");
+ * return -1;
+ * }
+ *
+ * // Create a new dataset within the file. The datatype
+ * // and dataspace describe the data on disk, which may
+ * // or may not be different from the format used in the
+ * // application's memory.
+ * if((dataset = H5Dcreate (file, DATASET_NAME, datatype, dataspace, H5P_DEFAULT,
+ * dset_create_props, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to create dataset\n");
+ * return -1;
+ * }
+ *
+ * // Write the array to the file. The datatype and dataspace
+ * // describe the format of the data in the 'orig_data' buffer.
+ * // We use default raw data transfer properties.
+ * if(H5Dwrite (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig_data) < 0) {
+ * printf("Error: fail to write to dataset\n");
+ * return -1;
+ * }
+ *
+ * H5Dclose (dataset);
+ *
+ * if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT)) < 0) {
+ * printf("Error: fail to open dataset\n");
+ * return -1;
+ * }
+ *
+ * // Read the array. This is similar to writing data,
+ * // except the data flows in the opposite direction.
+ * // Note: Decompression is automatic.
+ * if(H5Dread (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, new_data) < 0) {
+ * printf("Error: fail to read from dataset\n");
+ * return -1;
+ * }
+ *
+ * H5Tclose (datatype);
+ * H5Dclose (dataset);
+ * H5Sclose (dataspace);
+ * H5Pclose (dset_create_props);
+ * H5Fclose (file);
+ *
+ * return 0;
+ * }
+ * \endcode
+ *
+ * <h4>Limitations</h4>
+ * For floating-point data handling, there are some algorithmic limitations to the GRiB data packing
+ * mechanism:
+ * <ol><li>
+ * Both the E-scaling and D-scaling methods are lossy compression
+ * </li>
+ * <li>
+ * For the D-scaling method, since data values have been rounded to integer values (positive)
+ * before truncating to the minimum-bits, their range is limited by the maximum value that can be
+ * represented by the corresponding unsigned integer type (the same size as that of the floating-
+ * point type)
+ * </li></ol>
+ *
+ * <h4>Suggestions</h4>
+ * The following are some suggestions for using the filter for floating-point data:
+ * <ol><li>
+ * It is better to convert the units of data so that the units are within certain common range (for
+ * example, 1200m to 1.2km)
+ * </li>
+ * <li>
+ * If data values to be compressed are very near to zero, it is strongly recommended that the
+ * user sets the fill value away from zero (for example, a large positive number); if the user does
+ * nothing, the HDF5 library will set the fill value to zero, and this may cause undesirable
+ * compression results
+ * </li>
+ * <li>
+ * Users are not encouraged to use a very large decimal scale factor (for example, 100) for the
+ * D-scaling method; this can cause the filter not to ignore the fill value when finding maximum
+ * and minimum values, and they will get a much larger minimum-bits (poor compression)
+ * </li></ol>
+ *
+ * \subsubsection subsubsec_dataset_filters_szip Using the Szip Filter
+ * See The HDF Group website for further information regarding the Szip filter.
+ *
+ * Previous Chapter \ref sec_group - Next Chapter \ref sec_datatype
+ *
+ */
+
+/**
+ * \defgroup H5D Datasets (H5D)
*
* Use the functions in this module to manage HDF5 datasets, including the
* transfer of data between memory and disk and the description of dataset
diff --git a/src/H5Dpublic.h b/src/H5Dpublic.h
index 8126aff..6fad138 100644
--- a/src/H5Dpublic.h
+++ b/src/H5Dpublic.h
@@ -666,7 +666,7 @@ H5_DLL herr_t H5Dget_chunk_info_by_coord(hid_t dset_id, const hsize_t *offset, u
* \brief Iterate over all chunks of a chunked dataset
*
* \dset_id
- * \param[in] dxpl_id Identifier of a transfer property list
+ * \param[in] dxpl_id Identifier of a transfer property list
* \param[in] cb User callback function, called for every chunk.
* \param[in] op_data User-defined pointer to data required by op
*
diff --git a/src/H5ESmodule.h b/src/H5ESmodule.h
index 205089a..b05b7f4 100644
--- a/src/H5ESmodule.h
+++ b/src/H5ESmodule.h
@@ -28,7 +28,93 @@
#define H5_MY_PKG H5ES
#define H5_MY_PKG_ERR H5E_EVENTSET
-/**\defgroup H5ES H5ES
+/** \page H5ES_UG The HDF5 Event Set
+ * @todo Under Construction
+ *
+ * \section sec_async The HDF5 Event Set Interface
+ *
+ * \section subsec_async_intro Introduction
+ * HDF5 provides asynchronous APIs for the HDF5 VOL connectors that support asynchronous HDF5
+ * operations using the HDF5 Event Set (H5ES) API. This allows I/O to proceed in the background
+ * while the application is performing other tasks.
+ *
+ * To support AIO capabilities for the HDF5 VOL connectors, the AIO versions for the functions
+ * listed in the table below were added to HDF5 library version 1.13.0 and later. The async version
+ * of the function has “_async” suffix added to the function name. For example, the async version
+ * for H5Fcreate is H5Fcreate_async.
+ *
+ * <table>
+ * <tr>
+ * <th>Interface</th>
+ * <th>Functions</th>
+ * </tr>
+ * <tr>
+ * <th>H5F</th>
+ * <td>#H5Fcreate, #H5Fflush, #H5Fis_accessible, #H5Fopen, #H5Fclose
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5G</th>
+ * <td>#H5Gcreate, #H5Gget_info, #H5Gget_info_by_idx, #H5Gget_info_by_name, #H5Gclose
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5D</th>
+ * <td>#H5Dcreate, #H5Dopen, #H5Dset_extent, #H5Dwrite, #H5Dread, #H5Dget_space, #H5Dclose
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5A</th>
+ * <td>#H5Acreate, #H5Acreate_by_name, #H5Aopen, #H5Aopen_by_name, #H5Aexists, #H5Awrite, #H5Aread,
+#H5Aclose, #H5Aopen_by_idx, #H5Arename, #H5Arename_by_name
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5L</th>
+ * <td>#H5Lcreate_hard, #H5Lcreate_soft, #H5Ldelete, #H5Ldelete_by_idx, #H5Lexists
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5O</th>
+ * <td>#H5Ocopy, #H5Orefresh, #H5Oflush, #H5Oclose, #H5Oopen, #H5Oopen_by_idx
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5R</th>
+ * <td>#H5Ropen_attr, #H5Ropen_object #H5Ropen_region, #H5Rdereference
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5M</th>
+ * <td>#H5Mcreate, #H5Mopen, #H5Mput, #H5Mget, #H5Mclose
+ * </td>
+ * </tr>
+ * <tr>
+ * <th>H5T</th>
+ * <td>#H5Tcommit, #H5Topen, #H5Tcopy, #H5Tclose
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Async versions of the functions have an extra parameter called the event set parameter or es_id.
+ * For example, compare the signatures of #H5Dclose and #H5Dclose_async:
+ * \code
+ * herr_t H5Dclose(hid_t dset_id);
+ * herr_t H5Dclose_async(hid_t dset_id, hid_t es_id);
+ * \endcode
+ *
+ * An event set is an in-memory object that is created by an application and used to track many
+ * asynchronous operations with a single object. They function like a "bag" -- holding request
+ * tokens from one or more asynchronous operations and provide a simple interface for inspecting
+ * the status of the entire set of operations.
+ *
+ * See the \ref H5ES APIs that were added to the HDF5 library to manage event sets.
+ *
+ * Previous Chapter \ref sec_vol - Next Chapter \ref sec_map
+ *
+ */
+
+/**\defgroup H5ES Event Set Interface (H5ES)
*
* \todo Add the event set life cycle.
*
diff --git a/src/H5Emodule.h b/src/H5Emodule.h
index a2d59f3..0e4655c 100644
--- a/src/H5Emodule.h
+++ b/src/H5Emodule.h
@@ -28,30 +28,502 @@
#define H5_MY_PKG H5E
#define H5_MY_PKG_ERR H5E_ERROR
-/**\defgroup H5E H5E
+/** \page H5E_UG HDF5 Error Handling
*
- * Use the functions in this module to manage HDF5 error stacks and error
- * messages.
+ * \section sec_error HDF5 Error Handling
+ *
+ * The HDF5 library provides an error reporting mechanism for both the library itself and for user
+ * application programs. It can trace errors through function stack and error information like file
+ * name, function name, line number, and error description.
+ *
+ * \subsection subsec_error_intro Introduction
+ * The HDF5 Library provides an error reporting mechanism for both the library itself and for user application
+ * programs. It can trace errors through function stack and error information like file name, function name,
+ * line number, and error description.
+ *
+ * \ref subsec_error_ops discusses the basic error concepts such as error stack, error record, and error
+ * message and describes the related API functions. These concepts and functions are sufficient for
+ * application programs to trace errors inside the HDF5 Library.
+ *
+ * \ref subsec_error_adv talks about the advanced concepts of error
+ * class and error stack handle and talks about the related functions. With these concepts and functions, an
+ * application library or program using the HDF5 Library can have its own error report blended with HDF5’s
+ * error report.
+ *
+ * Starting with Release 1.8, we have a new set of Error Handling API functions. For the purpose of backward
+ * compatibility with version 1.6 and before, we still keep the old API functions, \ref H5Epush1,
+ * \ref H5Eprint1, \ref H5Ewalk1, \ref H5Eclear1, \ref H5Eget_auto1, \ref H5Eset_auto1. These functions do
+ * not have the error stack as a parameter. The library allows them to operate on the default error stack.
+ * (The H5E compatibility macros will choose the correct function based on the parameters)
+ *
+ * The old API is similar to functionality discussed in \ref subsec_error_ops. The functionality discussed in
+ * \ref subsec_error_adv,the ability of allowing applications to add their own error records, is the new
+ * design for the Error Handling API.
+ *
+ * \subsection subsec_error_H5E Error Handling Function Summaries
+ * @see H5E reference manual
+ *
+ * \subsection subsec_error_program Programming Model for Error Handling
+ * This section is under construction.
+ *
+ * \subsection subsec_error_ops Basic Error Handling Operations
+ * Let us first try to understand the error stack. An error stack is a collection of error records. Error
+ * records can be pushed onto or popped off the error stack. By default, when an error occurs deep within
+ * the HDF5 Library, an error record is pushed onto an error stack and that function returns a failure
+ * indication.
+ * Its caller detects the failure, pushes another record onto the stack, and returns a failure indication.
+ * This continues until the API function called by the application returns a failure indication. The next
+ * API function being called will reset the error stack. All HDF5 Library error records belong to the same
+ * error class. For more information, see \ref subsec_error_adv.
+ *
+ * \subsubsection subsubsec_error_ops_stack Error Stack and Error Message
+ * In normal circumstances, an error causes the stack to be printed on the standard error stream
+ * automatically.
+ * This automatic error stack is the library’s default stack. For all the functions in this section, whenever
+ * an error stack ID is needed as a parameter, \ref H5E_DEFAULT can be used to indicate the library’s default
+ * stack. The first error record of the error stack, number #000, is produced by the API function itself and
+ * is usually sufficient to indicate to the application what went wrong.
+ * <table>
+ * <caption align=top>Example: An Error Message</caption>
+ * <tr>
+ * <td>
+ * <p>If an application calls \ref H5Tclose on a
+ * predefined datatype then the following message is
+ * printed on the standard error stream. This is a
+ * simple error that has only one component, the API
+ * function; other errors may have many components.
+ * <p><code><pre>
+ * HDF5-DIAG: Error detected in HDF5 (1.10.9) thread 0.
+ * #000: H5T.c line ### in H5Tclose(): predefined datatype
+ * major: Function argument
+ * minor: Bad value
+ * </pre></code>
+ * </td>
+ * </tr>
+ * </table>
+ * In the example above, we can see that an error record has a major message and a minor message. A major
+ * message generally indicates where the error happens. The location can be a dataset or a dataspace, for
+ * example. A minor message explains further details of the error. An example is “unable to open file”.
+ * Another specific detail about the error can be found at the end of the first line of each error record.
+ * This error description is usually added by the library designer to tell what exactly goes wrong. In the
+ * example above, the “predefined datatype” is an error description.
+ *
+ * \subsubsection subsubsec_error_ops_print Print and Clear an Error Stack
+ * Besides the automatic error report, the error stack can also be printed and cleared by the functions
+ * \ref H5Eprint2 and \ref H5Eclear2. If an application wishes to make explicit
+ * calls to \ref H5Eprint2 to print the error stack, the automatic printing should be turned off
+ * to prevent error messages from being displayed twice (see \ref H5Eset_auto2).
+ *
+ * <em>To print an error stack:</em>
+ * \code
+ * herr_t H5Eprint2(hid_t error_stack, FILE * stream)
+ * \endcode
+ * This function prints the error stack specified by error_stack on the specified stream, stream. If the
+ * error stack is empty, a one‐line message will be printed. The following is an example of such a message.
+ * This message would be generated if the error was in the HDF5 Library.
+ * \code
+ * HDF5-DIAG: Error detected in HDF5 Library version: 1.10.9 thread 0.
+ * \endcode
+ *
+ * <em>To clear an error stack:</em>
+ * \code
+ * herr_t H5Eclear2(hid_t error_stack)
+ * \endcode
+ * The \ref H5Eclear2 function shown above clears the error stack specified by error_stack.
+ * \ref H5E_DEFAULT can be passed in to clear the current error stack. The current stack is also cleared
+ * whenever an API function is called; there are certain exceptions to this rule such as \ref H5Eprint2.
+ *
+ * \subsubsection subsubsec_error_ops_mute Mute Error Stack
+ * Sometimes an application calls a function for the sake of its return value, fully expecting the function
+ * to fail; sometimes the application wants to call \ref H5Eprint2 explicitly. In these situations,
+ * it would be misleading if an error message were still automatically printed. Using the
+ * \ref H5Eset_auto2 function can control the automatic printing of error messages.
+ *
+ * <em>To enable or disable automatic printing of errors:</em>
+ * \code
+ * herr_t H5Eset_auto2(hid_t error_stack, H5E_auto_t func, void *client_data)
+ * \endcode
+ * The \ref H5Eset_auto2 function can be used to turn on or off the automatic printing of errors
+ * for the error stack specified by error_stack. When turned on (non‐null func pointer), any API function
+ * which returns an error indication will first call func, passing it client_data as an argument. When the
+ * library is first initialized the auto printing function is set to \ref H5Eprint2 and client_data
+ * is the standard error stream pointer, stderr.
+ *
+ * <em>To see the current settings:</em>
+ * \code
+ * herr_t H5Eget_auto(hid_t error_stack, H5E_auto_t * func, void **client_data)
+ * \endcode
+ * The function above returns the current settings for the automatic error stack traversal function, func, and
+ * its data, client_data. If either or both of the arguments are null, then the value is not returned.
+ *
+ * An application can temporarily turn off error messages while “probing” a function. See the
+ * example below.
+ *
+ * <em>Example: Turn off error messages while probing a function</em>
+ * \code
+ * *** Save old error handler ***
+ * H5E_auto2_t oldfunc;
+ * void *old_client_data;
+ * H5Eget_auto2(error_stack, &old_func, &old_client_data);
+ * *** Turn off error handling ***
+ * H5Eset_auto2(error_stack, NULL, NULL);
+ * *** Probe. Likely to fail, but that’s okay ***
+ * status = H5Fopen (......);
+ * *** Restore previous error handler ***
+ * H5Eset_auto2(error_stack, old_func, old_client_data);
+ * \endcode
+ *
+ * Or automatic printing can be disabled altogether and error messages can be explicitly printed.
+ *
+ * <em>Example: Disable automatic printing and explicitly print error messages</em>
+ * \code
+ * *** Turn off error handling permanently ***
+ * H5Eset_auto2(error_stack, NULL, NULL);
+ * *** If failure, print error message ***
+ * if (H5Fopen (....)<0) {
+ * H5Eprint2(H5E_DEFAULT, stderr);
+ * exit (1);
+ * }
+ * \endcode
+ *
+ * \subsubsection subsubsec_error_ops_custom_print Customized Printing of an Error Stack
+ * Applications are allowed to define an automatic error traversal function other than the default
+ * \ref H5Eprint(). For instance, one can define a function that prints a simple, one‐line error message to
+ * the standard error stream and then exits. The first example below defines a such a function. The second
+ * example below installs the function as the error handler.
+ *
+ * <em>Example: Defining a function to print a simple error message</em>
+ * \code
+ * herr_t
+ * my_hdf5_error_handler(void *unused)
+ * {
+ * fprintf (stderr, “An HDF5 error was detected. Bye.\\n”);
+ * exit (1);
+ * }
+ * \endcode
+ *
+ * <em>Example: The user‐defined error handler</em>
+ * \code
+ * H5Eset_auto2(H5E_DEFAULT, my_hdf5_error_handler, NULL);
+ * \endcode
+ *
+ * \subsubsection subsubsec_error_ops_walk Walk through the Error Stack
+ * The \ref H5Eprint2 function is actually just a wrapper around the more complex \ref H5Ewalk function
+ * which traverses an error stack and calls a user‐defined function for each member of the stack. The example
+ * below shows how \ref H5Ewalk is used.
+ * \code
+ * herr_t H5Ewalk(hid_t err_stack, H5E_direction_t direction,
+ * H5E_walk_t func, void *client_data)
+ * \endcode
+ * The error stack err_stack is traversed and func is called for each member of the stack. Its arguments
+ * are an integer sequence number beginning at zero (regardless of direction) and the client_data
+ * pointer. If direction is \ref H5E_WALK_UPWARD, then traversal begins at the inner‐most function that
+ * detected the error and concludes with the API function. Use \ref H5E_WALK_DOWNWARD for the opposite
+ * order.
+ *
+ * \subsubsection subsubsec_error_ops_travers Traverse an Error Stack with a Callback Function
+ * An error stack traversal callback function takes three arguments: n is a sequence number beginning at
+ * zero for each traversal, eptr is a pointer to an error stack member, and client_data is the same pointer
+ * used in the example above passed to \ref H5Ewalk. See the example below.
+ * \code
+ * typedef herr_t (*H5E_walk_t)(unsigned n, H5E_error2_t *eptr, void *client_data)
+ * \endcode
+ * The H5E_error2_t structure is shown below.
+ * \code
+ * typedef struct {
+ * hid_t cls_id;
+ * hid_t maj_num;
+ * hid_t min_num;
+ * unsigned line;
+ * const char *func_name;
+ * const char *file_name;
+ * const char *desc;
+ * } H5E_error2_t;
+ * \endcode
+ * The maj_num and min_num are major and minor error IDs, func_name is the name of the function where
+ * the error was detected, file_name and line locate the error within the HDF5 Library source code, and
+ * desc points to a description of the error.
+ *
+ * The following example shows a user‐defined callback function.
+ *
+ * <em>Example: A user‐defined callback function</em>
+ * \code
+ * \#define MSG_SIZE 64
+ * herr_t
+ * custom_print_cb(unsigned n, const H5E_error2_t *err_desc, void *client_data)
+ * {
+ * FILE *stream = (FILE *)client_data;
+ * char maj[MSG_SIZE];
+ * char min[MSG_SIZE];
+ * char cls[MSG_SIZE];
+ * const int indent = 4;
+ *
+ * *** Get descriptions for the major and minor error numbers ***
+ * if(H5Eget_class_name(err_desc->cls_id, cls, MSG_SIZE) < 0)
+ * TEST_ERROR;
+ * if(H5Eget_msg(err_desc->maj_num, NULL, maj, MSG_SIZE) < 0)
+ * TEST_ERROR;
+ * if(H5Eget_msg(err_desc->min_num, NULL, min, MSG_SIZE) < 0)
+ * TEST_ERROR;
+ * fprintf (stream, “%*serror #%03d: %s in %s():
+ * line %u\\n”,
+ * indent, “”, n, err_desc->file_name,
+ * err_desc->func_name, err_desc->line);
+ * fprintf (stream, “%*sclass: %s\\n”, indent*2, “”, cls);
+ * fprintf (stream, “%*smajor: %s\\n”, indent*2, “”, maj);
+ * fprintf (stream, “%*sminor: %s\\n”, indent*2, “”, min);
+ * return 0;
+ * error:
+ * return -1;
+ * }
+ * \endcode
+ *
+ * <h4>Programming Note for C++ Developers Using C Functions</h4>
+ * If a C routine that takes a function pointer as an argument is called from within C++ code, the C routine
+ * should be returned from normally.
+ *
+ * Examples of this kind of routine include callbacks such as \ref H5Pset_elink_cb and
+ * \ref H5Pset_type_conv_cb and
+ * functions such as \ref H5Tconvert and \ref H5Ewalk2.
+ *
+ * Exiting the routine in its normal fashion allows the HDF5 C Library to clean up its work properly. In other
+ * words, if the C++ application jumps out of the routine back to the C++ “catch” statement, the library is
+ * not given the opportunity to close any temporary data structures that were set up when the routine was
+ * called. The C++ application should save some state as the routine is started so that any problem that
+ * occurs might be diagnosed.
+ *
+ * \subsection subsec_error_adv Advanced Error Handling Operations
+ * The section above, see \ref subsec_error_ops, discusses the basic error
+ * handling operations of the library. In that section, all the error records on the error stack are from the
+ * library itself. In this section, we are going to introduce the operations that allow an application program
+ * to push its own error records onto the error stack once it declares an error class of its own through the
+ * HDF5 Error API.
*
* <table>
- * <tr><th>Create</th><th>Read</th></tr>
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5E_examples.c create
- * </td>
- * <td>
- * \snippet{lineno} H5E_examples.c read
- * </td>
- * <tr><th>Update</th><th>Delete</th></tr>
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5E_examples.c update
- * </td>
- * <td>
- * \snippet{lineno} H5E_examples.c delete
- * </td>
- * </tr>
+ * <caption align=top>Example: An Error Report</caption>
+ * <tr>
+ * <td>
+ * <p>An error report shows both the library’s error record and the application’s error records.
+ * See the example below.
+ * <p><code><pre>
+ * Error Test-DIAG: Error detected in Error Program (1.0)
+ * thread 8192:
+ * #000: ../../hdf5/test/error_test.c line ### in main():
+ * Error test failed
+ * major: Error in test
+ * minor: Error in subroutine
+ * #001: ../../hdf5/test/error_test.c line ### in
+ * test_error(): H5Dwrite failed as supposed to
+ * major: Error in IO
+ * minor: Error in H5Dwrite
+ * HDF5-DIAG: Error detected in HDF5 (1.10.9) thread #####:
+ * #002: ../../hdf5/src/H5Dio.c line ### in H5Dwrite():
+ * not a dataset
+ * major: Invalid arguments to routine
+ * minor: Inappropriate type
+ * </pre></code>
+ * </td>
+ * </tr>
* </table>
+ * In the line above error record #002 in the example above, the starting phrase is HDF5. This is the error
+ * class name of the HDF5 Library. All of the library’s error messages (major and minor) are in this default
+ * error class. The Error Test in the beginning of the line above error record #000 is the name of the
+ * application’s error class. The first two error records, #000 and #001, are from application’s error class.
+ * By definition, an error class is a group of major and minor error messages for a library (the HDF5 Library
+ * or an application library built on top of the HDF5 Library) or an application program. The error class can
+ * be registered for a library or program through the HDF5 Error API. Major and minor messages can be defined
+ * in an error class. An application will have object handles for the error class and for major and minor
+ * messages for further operation. See the example below.
+ *
+ * <em>Example: The user‐defined error handler</em>
+ * \code
+ * \#define MSG_SIZE 64
+ * herr_t
+ * custom_print_cb(unsigned n, const H5E_error2_t *err_desc,
+ * void* client_data)
+ * {
+ * FILE *stream = (FILE *)client_data;
+ * char maj[MSG_SIZE];
+ * char min[MSG_SIZE];
+ * char cls[MSG_SIZE];
+ * const int indent = 4;
+ *
+ * *** Get descriptions for the major and minor error numbers ***
+ * if(H5Eget_class_name(err_desc->cls_id, cls, MSG_SIZE) < 0)
+ * TEST_ERROR;
+ * if(H5Eget_msg(err_desc->maj_num, NULL, maj, MSG_SIZE) < 0)
+ * TEST_ERROR;
+ * if(H5Eget_msg(err_desc->min_num, NULL, min, MSG_SIZE) < 0)
+ * TEST_ERROR;
+ * fprintf (stream, “%*serror #%03d: %s in %s():
+ * line %u\\n”,
+ * indent, “”, n, err_desc->file_name,
+ * err_desc->func_name, err_desc->line);
+ * fprintf (stream, “%*sclass: %s\\n”, indent*2, “”, cls);
+ * fprintf (stream, “%*smajor: %s\\n”, indent*2, “”, maj);
+ * fprintf (stream, “%*sminor: %s\\n”, indent*2, “”, min);
+ * return 0;
+ * error:
+ * return -1;
+ * }
+ * \endcode
+ *
+ * \subsubsection subsubsec_error_adv_more More Error API Functions
+ * The Error API has functions that can be used to register or unregister an error class, to create or close
+ * error messages, and to query an error class or error message. These functions are illustrated below.
+ *
+ * <em>To register an error class:</em>
+ * \code
+ * hid_t H5Eregister_class(const char* cls_name, const char* lib_name, const char* version)
+ * \endcode
+ * This function registers an error class with the HDF5 Library so that the application library or program
+ * can report errors together with the HDF5 Library.
+ *
+ * <em>To add an error message to an error class:</em>
+ * \code
+ * hid_t H5Ecreate_msg(hid_t class, H5E_type_t msg_type, const char* mesg)
+ * \endcode
+ * This function adds an error message to an error class defined by an application library or program. The
+ * error message can be either major or minor which is indicated by parameter msg_type.
+ *
+ * <em>To get the name of an error class:</em>
+ * \code
+ * ssize_t H5Eget_class_name(hid_t class_id, char* name, size_t size)
+ * \endcode
+ * This function retrieves the name of the error class specified by the class ID.
+ *
+ * <em>To retrieve an error message:</em>
+ * \code
+ * ssize_t H5Eget_msg(hid_t mesg_id, H5E_type_t* mesg_type, char* mesg, size_t size)
+ * \endcode
+ * This function retrieves the error message including its length and type.
+ *
+ * <em>To close an error message:</em>
+ * \code
+ * herr_t H5Eclose_msg(hid_t mesg_id)
+ * \endcode
+ * This function closes an error message.
+ *
+ * <em>To remove an error class:</em>
+ * \code
+ * herr_t H5Eunregister_class(hid_t class_id)
+ * \endcode
+ * This function removes an error class from the Error API.
+ *
+ * The example below shows how an application creates an error class and error messages.
+ *
+ * <em>Example: Create an error class and error messages</em>
+ * \code
+ * *** Create an error class ***
+ * class_id = H5Eregister_class(ERR_CLS_NAME, PROG_NAME, PROG_VERS);
+ * *** Retrieve class name ***
+ * H5Eget_class_name(class_id, cls_name, cls_size);
+ * *** Create a major error message in the class ***
+ * maj_id = H5Ecreate_msg(class_id, H5E_MAJOR, “... ...”);
+ * *** Create a minor error message in the class ***
+ * min_id = H5Ecreate_msg(class_id, H5E_MINOR, “... ...”);
+ * \endcode
+ *
+ * The example below shows how an application closes error messages and unregisters the error class.
+ *
+ * <em>Example: Closing error messages and unregistering the error class</em>
+ * \code
+ * H5Eclose_msg(maj_id);
+ * H5Eclose_msg(min_id);
+ * H5Eunregister_class(class_id);
+ * \endcode
+ *
+ * \subsubsection subsubsec_error_adv_app Pushing an Application Error Message onto Error Stack
+ * An application can push error records onto or pop error records off of the error stack just as the library
+ * does internally. An error stack can be registered, and an object handle can be returned to the application
+ * so that the application can manipulate a registered error stack.
+ *
+ * <em>To register the current stack:</em>
+ * \code
+ * hid_t H5Eget_current_stack(void)
+ * \endcode
+ * This function registers the current error stack, returns an object handle, and clears the current error
+ * stack.
+ * An empty error stack will also be assigned an ID.
+ *
+ * <em>To replace the current error stack with another:</em>
+ * \code
+ * herr_t H5Eset_current_stack(hid_t error_stack)
+ * \endcode
+ * This function replaces the current error stack with another error stack specified by error_stack and
+ * clears the current error stack. The object handle error_stack is closed after this function call.
+ *
+ * <em>To push a new error record to the error stack:</em>
+ * \code
+ * herr_t H5Epush(hid_t error_stack, const char* file, const char* func,
+ * unsigned line, hid_t cls_id, hid_t major_id, hid_t minor_id,
+ * const char* desc, ... )
+ * \endcode
+ * This function pushes a new error record onto the error stack for the current thread.
+ *
+ * <em>To delete some error messages:</em>
+ * \code
+ * herr_t H5Epop(hid_t error_stack, size_t count)
+ * \endcode
+ * This function deletes some error messages from the error stack.
+ *
+ * <em>To retrieve the number of error records:</em>
+ * \code
+ * int H5Eget_num(hid_t error_stack)
+ * \endcode
+ * This function retrieves the number of error records from an error stack.
+ *
+ * <em>To clear the error stack:</em>
+ * \code
+ * herr_t H5Eclear_stack(hid_t error_stack)
+ * \endcode
+ * This function clears the error stack.
+ *
+ * <em>To close the object handle for an error stack:</em>
+ * \code
+ * herr_t H5Eclose_stack(hid_t error_stack)
+ * \endcode
+ * This function closes the object handle for an error stack and releases its resources.
+ *
+ * The example below shows how an application pushes an error record onto the default error stack.
+ *
+ * <em>Example: Pushing an error message to an error stack</em>
+ * \code
+ * *** Make call to HDF5 I/O routine ***
+ * if((dset_id=H5Dopen(file_id, dset_name, access_plist)) < 0)
+ * {
+ * *** Push client error onto error stack ***
+ * H5Epush(H5E_DEFAULT,__FILE__,FUNC,__LINE__,cls_id,
+ * CLIENT_ERR_MAJ_IO,CLIENT_ERR_MINOR_OPEN, “H5Dopen failed”);
+ * }
+ * *** Indicate error occurred in function ***
+ * return 0;
+ * \endcode
+ *
+ * The example below shows how an application registers the current error stack and
+ * creates an object handle to avoid another HDF5 function from clearing the error stack.
+ *
+ * <em>Example: Registering the error stack</em>
+ * \code
+ * if (H5Dwrite(dset_id, mem_type_id, mem_space_id, file_space_id, dset_xfer_plist_id, buf) < 0)
+ * {
+ * *** Push client error onto error stack ***
+ * H5Epush2(H5E_DEFAULT,__FILE__,FUNC,__LINE__,cls_id,
+ * CLIENT_ERR_MAJ_IO,CLIENT_ERR_MINOR_HDF5,
+ * “H5Dwrite failed”);
+ * *** Preserve the error stack by assigning an object handle to it ***
+ * error_stack = H5Eget_current_stack();
+ * *** Close dataset ***
+ * H5Dclose(dset_id);
+ * *** Replace the current error stack with the preserved one ***
+ * H5Eset_current_stack(error_stack);
+ * }
+ * return 0;
+ * \endcode
+ *
+ * Previous Chapter \ref sec_attribute - Next Chapter \ref sec_plist
+ *
+ * \defgroup H5E Error Handling (H5E)
*
* \internal The \c FUNC_ENTER macro clears the error stack whenever an
* interface function is entered. When an error is detected, an entry
@@ -76,6 +548,8 @@
* error stack. The error stack is statically allocated to reduce the
* complexity of handling errors within the \ref H5E package.
*
+ * @see sec_error
+ *
*/
#endif /* H5Emodule_H */
diff --git a/src/H5Epublic.h b/src/H5Epublic.h
index 0254c37..6e47d28 100644
--- a/src/H5Epublic.h
+++ b/src/H5Epublic.h
@@ -899,8 +899,8 @@ H5_DLL herr_t H5Ewalk1(H5E_direction_t direction, H5E_walk1_t func, void *client
*
* \deprecated 1.8.0 Function deprecated in this release.
*
- * \details Given a major error number, H5Eget_major() returns a constant
- * character string that describes the error.
+ * \details H5Eget_major() returns a constant
+ * character string that describes the error, given a major error number.
*
* \attention This function returns a dynamically allocated string (\c char
* array). An application calling this function must free the memory
@@ -920,8 +920,8 @@ H5_DLL char *H5Eget_major(H5E_major_t maj);
*
* \deprecated 1.8.0 Function deprecated and return type changed in this release.
*
- * \details Given a minor error number, H5Eget_minor() returns a constant
- * character string that describes the error.
+ * \details H5Eget_minor() returns a constant
+ * character string that describes the error, given a minor error number.
*
* \attention In the Release 1.8.x series, H5Eget_minor() returns a string of
* dynamic allocated \c char array. An application calling this
diff --git a/src/H5Fmodule.h b/src/H5Fmodule.h
index 6047693..867ef0e 100644
--- a/src/H5Fmodule.h
+++ b/src/H5Fmodule.h
@@ -28,7 +28,1448 @@
#define H5_MY_PKG H5F
#define H5_MY_PKG_ERR H5E_FILE
-/**\defgroup H5F H5F
+/** \page H5F_UG The HDF5 File
+ *
+ * \section sec_file The HDF5 File
+ * \subsection subsec_file_intro Introduction
+ * The purpose of this chapter is to describe how to work with HDF5 data files.
+ *
+ * If HDF5 data is to be written to or read from a file, the file must first be explicitly created or
+ * opened with the appropriate file driver and access privileges. Once all work with the file is
+ * complete, the file must be explicitly closed.
+ *
+ * This chapter discusses the following:
+ * \li File access modes
+ * \li Creating, opening, and closing files
+ * \li The use of file creation property lists
+ * \li The use of file access property lists
+ * \li The use of low-level file drivers
+ *
+ * This chapter assumes an understanding of the material presented in the data model chapter. For
+ * more information, @see @ref sec_data_model.
+ *
+ * \subsection subsec_file_access_modes File Access Modes
+ * There are two issues regarding file access:
+ * <ul><li>What should happen when a new file is created but a file of the same name already
+ * exists? Should the create action fail, or should the existing file be overwritten?</li>
+ * <li>Is a file to be opened with read-only or read-write access?</li></ul>
+ *
+ * Four access modes address these concerns. Two of these modes can be used with #H5Fcreate, and
+ * two modes can be used with #H5Fopen.
+ * \li #H5Fcreate accepts #H5F_ACC_EXCL or #H5F_ACC_TRUNC
+ * \li #H5Fopen accepts #H5F_ACC_RDONLY or #H5F_ACC_RDWR
+ *
+ * The access modes are described in the table below.
+ *
+ * <table>
+ * <caption>Access flags and modes</caption>
+ * <tr>
+ * <th>Access Flag</th>
+ * <th>Resulting Access Mode</th>
+ * </tr>
+ * <tr>
+ * <td>#H5F_ACC_EXCL</td>
+ * <td>If the file already exists, #H5Fcreate fails. If the file does not exist,
+ * it is created and opened with read-write access. (Default)</td>
+ * </tr>
+ * <tr>
+ * <td>#H5F_ACC_TRUNC</td>
+ * <td>If the file already exists, the file is opened with read-write access,
+ * and new data will overwrite any existing data. If the file does not exist,
+ * it is created and opened with read-write access.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5F_ACC_RDONLY</td>
+ * <td>An existing file is opened with read-only access. If the file does not
+ * exist, #H5Fopen fails. (Default)</td>
+ * </tr>
+ * <tr>
+ * <td>#H5F_ACC_RDWR</td>
+ * <td>An existing file is opened with read-write access. If the file does not
+ * exist, #H5Fopen fails.</td>
+ * </tr>
+ * </table>
+ *
+ * By default, #H5Fopen opens a file for read-only access; passing #H5F_ACC_RDWR allows
+ * read-write access to the file.
+ *
+ * By default, #H5Fcreate fails if the file already exists; only passing #H5F_ACC_TRUNC allows
+ * the truncating of an existing file.
+ *
+ * \subsection subsec_file_creation_access File Creation and File Access Properties
+ * File creation and file access property lists control the more complex aspects of creating and
+ * accessing files.
+ *
+ * File creation property lists control the characteristics of a file such as the size of the userblock,
+ * a user-definable data block; the size of data address parameters; properties of the B-trees that are
+ * used to manage the data in the file; and certain HDF5 Library versioning information.
+ *
+ * For more information, @see @ref subsubsec_file_property_lists_props.
+ *
+ * This section has a more detailed discussion of file creation properties. If you have no special
+ * requirements for these file characteristics, you can simply specify #H5P_DEFAULT for the default
+ * file creation property list when a file creation property list is called for.
+ *
+ * File access property lists control properties and means of accessing a file such as data alignment
+ * characteristics, metadata block and cache sizes, data sieve buffer size, garbage collection
+ * settings, and parallel I/O. Data alignment, metadata block and cache sizes, and data sieve buffer
+ * size are factors in improving I/O performance.
+ *
+ * For more information, @see @ref subsubsec_file_property_lists_access.
+ *
+ * This section has a more detailed discussion of file access properties. If you have no special
+ * requirements for these file access characteristics, you can simply specify #H5P_DEFAULT for the
+ * default file access property list when a file access property list is called for.
+ *
+ * <table>
+ * <caption>Figure 10 - More sample file structures</caption>
+ * <tr>
+ * <td>
+ * \image html UML_FileAndProps.gif "UML model for an HDF5 file and its property lists"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_file_drivers Low-level File Drivers
+ * The concept of an HDF5 file is actually rather abstract: the address space for what is normally
+ * thought of as an HDF5 file might correspond to any of the following at the storage level:
+ * \li Single file on a standard file system
+ * \li Multiple files on a standard file system
+ * \li Multiple files on a parallel file system
+ * \li Block of memory within an application’s memory space
+ * \li More abstract situations such as virtual files
+ *
+ * This HDF5 address space is generally referred to as an HDF5 file regardless of its organization at
+ * the storage level.
+ *
+ * HDF5 accesses a file (the address space) through various types of low-level file drivers. The
+ * default HDF5 file storage layout is as an unbuffered permanent file which is a single, contiguous
+ * file on local disk. Alternative layouts are designed to suit the needs of a variety of systems,
+ * environments, and applications.
+ *
+ * \subsection subsec_file_program_model Programming Model for Files
+ * Programming models for creating, opening, and closing HDF5 files are described in the
+ * sub-sections below.
+ *
+ * \subsubsection subsubsec_file_program_model_create Creating a New File
+ * The programming model for creating a new HDF5 file can be summarized as follows:
+ * \li Define the file creation property list
+ * \li Define the file access property list
+ * \li Create the file
+ *
+ * First, consider the simple case where we use the default values for the property lists. See the
+ * example below.
+ *
+ * <em>Creating an HDF5 file using property list defaults</em>
+ * \code
+ * file_id = H5Fcreate ("SampleFile.h5", H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT)
+ * \endcode
+ *
+ * Note: The example above specifies that #H5Fcreate should fail if SampleFile.h5 already exists.
+ *
+ * A more complex case is shown in the example below. In this example, we define file creation
+ * and access property lists (though we do not assign any properties), specify that #H5Fcreate
+ * should fail if SampleFile.h5 already exists, and create a new file named SampleFile.h5. The example
+ * does not specify a driver, so the default driver, #H5FD_SEC2, will be used.
+ *
+ * <em>Creating an HDF5 file using property lists</em>
+ * \code
+ * fcplist_id = H5Pcreate (H5P_FILE_CREATE)
+ * <...set desired file creation properties...>
+ * faplist_id = H5Pcreate (H5P_FILE_ACCESS)
+ * <...set desired file access properties...>
+ * file_id = H5Fcreate ("SampleFile.h5", H5F_ACC_EXCL, fcplist_id, faplist_id)
+ * \endcode
+ * Notes:
+ * 1. A root group is automatically created in a file when the file is first created.
+ *
+ * 2. File property lists, once defined, can be reused when another file is created within the same
+ * application.
+ *
+ * \subsubsection subsubsec_file_program_model_open Opening an Existing File
+ * The programming model for opening an existing HDF5 file can be summarized as follows:
+ * <ul><li>Define or modify the file access property list including a low-level file driver (optional)</li>
+ * <li>Open the file</li></ul>
+ *
+ * The code in the example below shows how to open an existing file with read-only access.
+ *
+ * <em>Opening an HDF5 file</em>
+ * \code
+ * faplist_id = H5Pcreate (H5P_FILE_ACCESS)
+ * status = H5Pset_fapl_stdio (faplist_id)
+ * file_id = H5Fopen ("SampleFile.h5", H5F_ACC_RDONLY, faplist_id)
+ * \endcode
+ *
+ * \subsubsection subsubsec_file_program_model_close Closing a File
+ * The programming model for closing an HDF5 file is very simple:
+ * \li Close file
+ *
+ * We close SampleFile.h5 with the code in the example below.
+ *
+ * <em>Closing an HDF5 file</em>
+ * \code
+ * status = H5Fclose (file_id)
+ * \endcode
+ * Note that #H5Fclose flushes all unwritten data to storage and that file_id is the identifier returned
+ * for SampleFile.h5 by #H5Fopen.
+ *
+ * More comprehensive discussions regarding all of these steps are provided below.
+ *
+ * \subsection subsec_file_h5dump Using h5dump to View a File
+ * h5dump is a command-line utility that is included in the HDF5 distribution. This program
+ * provides a straight-forward means of inspecting the contents of an HDF5 file. You can use
+ * h5dump to verify that a program is generating the intended HDF5 file. h5dump displays ASCII
+ * output formatted according to the HDF5 DDL grammar.
+ *
+ * The following h5dump command will display the contents of SampleFile.h5:
+ * \code
+ * h5dump SampleFile.h5
+ * \endcode
+ *
+ * If no datasets or groups have been created in and no data has been written to the file, the output
+ * will look something like the following:
+ * \code
+ * HDF5 "SampleFile.h5" {
+ * GROUP "/" {
+ * }
+ * }
+ * \endcode
+ *
+ * Note that the root group, indicated above by /, was automatically created when the file was created.
+ *
+ * h5dump is described on the
+ * <a href="https://portal.hdfgroup.org/display/HDF5/h5dump">Tools</a>
+ * page under
+ * <a href="https://portal.hdfgroup.org/display/HDF5/Libraries+and+Tools+Reference">
+ * Libraries and Tools Reference</a>.
+ * The HDF5 DDL grammar is described in the document \ref DDLBNF110.
+ *
+ * \subsection subsec_file_summary File Function Summaries
+ * General library (\ref H5 functions and macros), (\ref H5F functions), file related
+ * (\ref H5P functions), and file driver (\ref H5P functions) are listed below.
+ *
+ * <table>
+ * <caption>General library functions and macros</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5check_version</td>
+ * <td>Verifies that HDF5 library versions are consistent.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5close</td>
+ * <td>Flushes all data to disk, closes all open identifiers, and cleans up memory.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5dont_atexit</td>
+ * <td>Instructs the library not to install the atexit cleanup routine.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5garbage_collect</td>
+ * <td>Garbage collects on all free-lists of all types.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5get_libversion</td>
+ * <td>Returns the HDF library release number.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5open</td>
+ * <td>Initializes the HDF5 library.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5set_free_list_limits</td>
+ * <td>Sets free-list size limits.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5_VERSION_GE</td>
+ * <td>Determines whether the version of the library being used is greater than or equal
+ * to the specified version.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5_VERSION_LE</td>
+ * <td>Determines whether the version of the library being used is less than or equal
+ * to the specified version.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>File functions </caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Fclear_elink_file_cache</td>
+ * <td>Clears the external link open file cache for a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fclose</td>
+ * <td>Closes HDF5 file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fcreate</td>
+ * <td>Creates new HDF5 file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fflush</td>
+ * <td>Flushes data to HDF5 file on storage medium.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_access_plist</td>
+ * <td>Returns a file access property list identifier.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_create_plist</td>
+ * <td>Returns a file creation property list identifier.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_file_image</td>
+ * <td>Retrieves a copy of the image of an existing, open file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_filesize</td>
+ * <td>Returns the size of an HDF5 file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_freespace</td>
+ * <td>Returns the amount of free space in a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_info</td>
+ * <td>Returns global information for a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_intent</td>
+ * <td>Determines the read/write or read-only status of a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_mdc_config</td>
+ * <td>Obtain current metadata cache configuration for target file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_mdc_hit_rate</td>
+ * <td>Obtain target file’s metadata cache hit rate.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_mdc_size</td>
+ * <td>Obtain current metadata cache size data for specified file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_mpi_atomicity</td>
+ * <td>Retrieves the atomicity mode in use.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_name</td>
+ * <td>Retrieves the name of the file to which the object belongs.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_obj_count</td>
+ * <td>Returns the number of open object identifiers for an open file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_obj_ids</td>
+ * <td>Returns a list of open object identifiers.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fget_vfd_handle</td>
+ * <td>Returns pointer to the file handle from the virtual file driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fis_hdf5</td>
+ * <td>Determines whether a file is in the HDF5 format.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fmount</td>
+ * <td>Mounts a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fopen</td>
+ * <td>Opens an existing HDF5 file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Freopen</td>
+ * <td>Returns a new identifier for a previously-opened HDF5 file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Freset_mdc_hit_rate_stats</td>
+ * <td>Reset hit rate statistics counters for the target file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fset_mdc_config</td>
+ * <td>Use to configure metadata cache of target file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fset_mpi_atomicity</td>
+ * <td>Use to set the MPI atomicity mode.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Funmount</td>
+ * <td>Unmounts a file.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>File creation property list functions </caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_userblock/#H5Pget_userblock</td>
+ * <td>Sets/retrieves size of userblock.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_sizes/#H5Pget_sizes</td>
+ * <td>Sets/retrieves byte size of offsets and lengths used to address objects in HDF5 file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_sym_k/#H5Pget_sym_k</td>
+ * <td>Sets/retrieves size of parameters used to control symbol table nodes.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_istore_k/#H5Pget_istore_k</td>
+ * <td>Sets/retrieves size of parameter used to control B-trees for indexing chunked datasets.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_file_image</td>
+ * <td>Sets an initial file image in a memory buffer.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_file_image</td>
+ * <td>Retrieves a copy of the file image designated as the initial content and structure of a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_shared_mesg_nindexes/#H5Pget_shared_mesg_nindexes</td>
+ * <td>Sets or retrieves number of shared object header message indexes in file
+ * creation property list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_shared_mesg_index</td>
+ * <td>Configures the specified shared object header message index.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_shared_mesg_index</td>
+ * <td>Retrieves the configuration settings for a shared message index.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_shared_mesg_phase_change/#H5Pget_shared_mesg_phase_change</td>
+ * <td>Sets or retrieves shared object header message storage phase change thresholds.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_version</td>
+ * <td></td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>File access property list functions </caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_alignment/#H5Pget_alignment</td>
+ * <td>Sets/retrieves alignment properties.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_cache/#H5Pget_cache</td>
+ * <td>Sets/retrieves metadata cache and raw data chunk cache parameters.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_elink_file_cache_size/#H5Pget_elink_file_cache_size</td>
+ * <td>Sets/retrieves the size of the external link open file cache from the specified
+ * file access property list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_gc_references/#H5Pget_gc_references</td>
+ * <td>Sets/retrieves garbage collecting references flag.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_family_offset</td>
+ * <td>Sets offset property for low-level access to a file in a family of files.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_family_offset</td>
+ * <td>Retrieves a data offset from the file access property list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_meta_block_size/#H5Pget_meta_block_size</td>
+ * <td>Sets the minimum metadata blocksize or retrieves the current metadata block size setting.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_mdc_config</td>
+ * <td>Set the initial metadata cache configuration in the indicated File Access Property List
+ * to the supplied value.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_mdc_config</td>
+ * <td>Get the current initial metadata cache config-uration from the indicated File Access
+ * Property List.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_sieve_buf_size/#H5Pget_sieve_buf_size</td>
+ * <td>Sets/retrieves maximum size of data sieve buffer.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_libver_bounds</td>
+ * <td>Sets bounds on library versions, and indirectly format versions, to be used
+ * when creating objects.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_libver_bounds</td>
+ * <td>Retrieves library version bounds settings that indirectly control the format
+ * versions used when creating objects.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_small_data_block_size</td>
+ * <td>Sets the size of a contiguous block reserved for small data.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_small_data_block_size</td>
+ * <td>Retrieves the current small data block size setting.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>File driver functions </caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_driver</td>
+ * <td>Sets a file driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_driver</td>
+ * <td>Returns the identifier for the driver used to create a file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_driver_info</td>
+ * <td>Returns a pointer to file driver information.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_core/#H5Pget_fapl_core</td>
+ * <td>Sets the driver for buffered memory files (in RAM) or retrieves information regarding
+ * the driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_direct/#H5Pget_fapl_direct</td>
+ * <td>Sets up use of the direct I/O driver or retrieves the direct I/O driver settings.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_family/#H5Pget_fapl_family</td>
+ * <td>Sets driver for file families, designed for systems that do not support files
+ * larger than 2 gigabytes, or retrieves information regarding driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_log</td>
+ * <td>Sets logging driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_mpio/#H5Pget_fapl_mpio</td>
+ * <td>Sets driver for files on parallel file systems (MPI I/O) or retrieves information
+ * regarding the driver.</td>
+ * </tr>
+ * <tr>
+ * <td>H5Pset_fapl_mpiposix/H5Pget_fapl_mpiposix</td>
+ * <td>No longer available.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_multi/#H5Pget_fapl_multi</td>
+ * <td>Sets driver for multiple files, separating categories of metadata and raw data,
+ * or retrieves information regarding driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_sec2</td>
+ * <td>Sets driver for unbuffered permanent files or retrieves information regarding driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_split</td>
+ * <td>Sets driver for split files, a limited case of multiple files with one metadata file
+ * and one raw data file.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_stdio</td>
+ * <td>Sets driver for buffered permanent files.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fapl_windows</td>
+ * <td>Sets the Windows I/O driver.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_multi_type</td>
+ * <td>Specifies type of data to be accessed via the MULTI driver enabling more direct access.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_multi_type</td>
+ * <td>Retrieves type of data property for MULTI driver.</td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_file_create Creating or Opening an HDF5 File
+ * This section describes in more detail how to create and how to open files.
+ *
+ * New HDF5 files are created and opened with #H5Fcreate; existing files are opened with
+ * #H5Fopen. Both functions return an object identifier which must eventually be released by calling
+ * #H5Fclose.
+ *
+ * To create a new file, call #H5Fcreate:
+ * \code
+ * hid_t H5Fcreate (const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
+ * \endcode
+ *
+ * #H5Fcreate creates a new file named name in the current directory. The file is opened with read
+ * and write access; if the #H5F_ACC_TRUNC flag is set, any pre-existing file of the same name in
+ * the same directory is truncated. If #H5F_ACC_TRUNC is not set or #H5F_ACC_EXCL is set and
+ * if a file of the same name exists, #H5Fcreate will fail.
+ *
+ * The new file is created with the properties specified in the property lists fcpl_id and fapl_id.
+ * fcpl is short for file creation property list. fapl is short for file access property list. Specifying
+ * #H5P_DEFAULT for either the creation or access property list will use the library’s default
+ * creation or access properties.
+ *
+ * If #H5Fcreate successfully creates the file, it returns a file identifier for the new file. This
+ * identifier will be used by the application any time an object identifier, an OID, for the file is
+ * required. Once the application has finished working with a file, the identifier should be released
+ * and the file closed with #H5Fclose.
+ *
+ * To open an existing file, call #H5Fopen:
+ * \code
+ * hid_t H5Fopen (const char *name, unsigned flags, hid_t fapl_id)
+ * \endcode
+ *
+ * #H5Fopen opens an existing file with read-write access if #H5F_ACC_RDWR is set and read-only
+ * access if #H5F_ACC_RDONLY is set.
+ *
+ * fapl_id is the file access property list identifier. Alternatively, #H5P_DEFAULT indicates that the
+ * application relies on the default I/O access parameters. Creating and changing access property
+ * lists is documented further below.
+ *
+ * A file can be opened more than once via multiple #H5Fopen calls. Each such call returns a unique
+ * file identifier and the file can be accessed through any of these file identifiers as long as they
+ * remain valid. Each of these file identifiers must be released by calling #H5Fclose when it is no
+ * longer needed.
+ *
+ * For more information, @see @ref subsubsec_file_property_lists_access.
+ * For more information, @see @ref subsec_file_property_lists.
+ *
+ * \subsection subsec_file_closes Closing an HDF5 File
+ * #H5Fclose both closes a file and releases the file identifier returned by #H5Fopen or #H5Fcreate.
+ * #H5Fclose must be called when an application is done working with a file; while the HDF5
+ * Library makes every effort to maintain file integrity, failure to call #H5Fclose may result in the
+ * file being abandoned in an incomplete or corrupted state.
+ *
+ * To close a file, call #H5Fclose:
+ * \code
+ * herr_t H5Fclose (hid_t file_id)
+ * \endcode
+ * This function releases resources associated with an open file. After closing a file, the file
+ * identifier, file_id, cannot be used again as it will be undefined.
+ *
+ * #H5Fclose fulfills three purposes: to ensure that the file is left in an uncorrupted state, to ensure
+ * that all data has been written to the file, and to release resources. Use #H5Fflush if you wish to
+ * ensure that all data has been written to the file but it is premature to close it.
+ *
+ * Note regarding serial mode behavior: When #H5Fclose is called in serial mode, it closes the file
+ * and terminates new access to it, but it does not terminate access to objects that remain
+ * individually open within the file. That is, if #H5Fclose is called for a file but one or more objects
+ * within the file remain open, those objects will remain accessible until they are individually
+ * closed. To illustrate, assume that a file, fileA, contains a dataset, data_setA, and that both are
+ * open when #H5Fclose is called for fileA. data_setA will remain open and accessible, including
+ * writable, until it is explicitly closed. The file will be automatically and finally closed once all
+ * objects within it have been closed.
+ *
+ * Note regarding parallel mode behavior: Once #H5Fclose has been called in parallel mode, access
+ * is no longer available to any object within the file.
+ *
+ * \subsection subsec_file_property_lists File Property Lists
+ * Additional information regarding file structure and access are passed to #H5Fcreate and
+ * #H5Fopen through property list objects. Property lists provide a portable and extensible method of
+ * modifying file properties via simple API functions. There are two kinds of file-related property
+ * lists:
+ * \li File creation property lists
+ * \li File access property lists
+ *
+ * In the following sub-sections, we discuss only one file creation property, userblock size, in detail
+ * as a model for the user. Other file creation and file access properties are mentioned and defined
+ * briefly, but the model is not expanded for each; complete syntax, parameter, and usage
+ * information for every property list function is provided in the \ref H5P
+ * section of the HDF5 Reference Manual.
+ *
+ * For more information, @see @ref sec_plist.
+ *
+ * \subsubsection subsubsec_file_property_lists_create Creating a Property List
+ * If you do not wish to rely on the default file creation and access properties, you must first create
+ * a property list with #H5Pcreate.
+ * \code
+ * hid_t H5Pcreate (hid_t cls_id)
+ * \endcode
+ * cls_id is the type of property list being created. In this case, the appropriate values are
+ * #H5P_FILE_CREATE for a file creation property list and #H5P_FILE_ACCESS for a file access
+ * property list.
+ *
+ * Thus, the following calls create a file creation property list and a file access property list with
+ * identifiers fcpl_id and fapl_id, respectively:
+ * \code
+ * fcpl_id = H5Pcreate (H5P_FILE_CREATE)
+ * fapl_id = H5Pcreate (H5P_FILE_ACCESS)
+ * \endcode
+ *
+ * Once the property lists have been created, the properties themselves can be modified via the
+ * functions described in the following sub-sections.
+ *
+ * \subsubsection subsubsec_file_property_lists_props File Creation Properties
+ * File creation property lists control the file metadata, which is maintained in the superblock of the
+ * file. These properties are used only when a file is first created.
+ *
+ * <h4>Userblock Size</h4>
+ * \code
+ * herr_t H5Pset_userblock (hid_t plist, hsize_t size)
+ * herr_t H5Pget_userblock (hid_t plist, hsize_t *size)
+ * \endcode
+ *
+ * The userblock is a fixed-length block of data located at the beginning of the file and is ignored
+ * by the HDF5 library. This block is specifically set aside for any data or information that
+ * developers determine to be useful to their applications but that will not be used by the HDF5
+ * library. The size of the userblock is defined in bytes and may be set to any power of two with a
+ * minimum size of 512 bytes. In other words, userblocks might be 512, 1024, or 2048 bytes in
+ * size.
+ *
+ * This property is set with #H5Pset_userblock and queried via #H5Pget_userblock. For example, if
+ * an application needed a 4K userblock, then the following function call could be used:
+ * \code
+ * status = H5Pset_userblock(fcpl_id, 4096)
+ * \endcode
+ *
+ * The property list could later be queried with:
+ * \code
+ * status = H5Pget_userblock(fcpl_id, size)
+ * \endcode
+ * and the value 4096 would be returned in the parameter size.
+ *
+ * Other properties, described below, are set and queried in exactly the same manner. Syntax and
+ * usage are detailed in the @ref H5P section of the HDF5 Reference Manual.
+ *
+ * <h4>Offset and Length Sizes</h4>
+ * This property specifies the number of bytes used to store the offset and length of objects in the
+ * HDF5 file. Values of 2, 4, and 8 bytes are currently supported to accommodate 16-bit, 32-bit,
+ * and 64-bit file address spaces.
+ *
+ * These properties are set and queried via #H5Pset_sizes and #H5Pget_sizes.
+ *
+ * <h4>Symbol Table Parameters</h4>
+ * The size of symbol table B-trees can be controlled by setting the 1/2-rank and 1/2-node size
+ * parameters of the B-tree.
+ *
+ * These properties are set and queried via #H5Pset_sym_k and #H5Pget_sym_k
+ *
+ * <h4>Indexed Storage Parameters</h4>
+ * The size of indexed storage B-trees can be controlled by setting the 1/2-rank and 1/2-node size
+ * parameters of the B-tree.
+ *
+ * These properties are set and queried via #H5Pset_istore_k and #H5Pget_istore_k.
+ *
+ * <h4>Version Information</h4>
+ * Various objects in an HDF5 file may over time appear in different versions. The HDF5 Library
+ * keeps track of the version of each object in the file.
+ *
+ * Version information is retrieved via #H5Pget_version.
+ *
+ * \subsubsection subsubsec_file_property_lists_access File Access Properties
+ * This section discusses file access properties that are not related to the low-level file drivers. File
+ * drivers are discussed separately later in this chapter.
+ * For more information, @see @ref subsec_file_alternate_drivers.
+ *
+ * File access property lists control various aspects of file I/O and structure.
+ *
+ * <h4>Data Alignment</h4>
+ * Sometimes file access is faster if certain data elements are aligned in a specific manner. This can
+ * be controlled by setting alignment properties via the #H5Pset_alignment function. There are two
+ * values involved:
+ * \li A threshold value
+ * \li An alignment interval
+ *
+ * Any allocation request at least as large as the threshold will be aligned on an address that is a
+ * multiple of the alignment interval.
+ *
+ * <h4>Metadata Block Allocation Size</h4>
+ * Metadata typically exists as very small chunks of data; storing metadata elements in a file
+ * without blocking them can result in hundreds or thousands of very small data elements in the
+ * file. This can result in a highly fragmented file and seriously impede I/O. By blocking metadata
+ * elements, these small elements can be grouped in larger sets, thus alleviating both problems.
+ *
+ * #H5Pset_meta_block_size sets the minimum size in bytes of metadata block allocations.
+ * #H5Pget_meta_block_size retrieves the current minimum metadata block allocation size.
+ *
+ * <h4>Metadata Cache</h4>
+ * Metadata and raw data I/O speed are often governed by the size and frequency of disk reads and
+ * writes. In many cases, the speed can be substantially improved by the use of an appropriate
+ * cache.
+ *
+ * #H5Pset_cache sets the minimum cache size for both metadata and raw data and a preemption
+ * value for raw data chunks. #H5Pget_cache retrieves the current values.
+ *
+ * <h4>Data Sieve Buffer Size</h4>
+ * Data sieve buffering is used by certain file drivers to speed data I/O and is most commonly when
+ * working with dataset hyperslabs. For example, using a buffer large enough to hold several pieces
+ * of a dataset as it is read in for hyperslab selections will boost performance noticeably.
+ *
+ * #H5Pset_sieve_buf_size sets the maximum size in bytes of the data sieve buffer.
+ * #H5Pget_sieve_buf_size retrieves the current maximum size of the data sieve buffer.
+ *
+ * <h4>Garbage Collection References</h4>
+ * Dataset region references and other reference types use space in an HDF5 file’s global heap. If
+ * garbage collection is on (1) and the user passes in an uninitialized value in a reference structure,
+ * the heap might become corrupted. When garbage collection is off (0), however, and the user reuses
+ * a reference, the previous heap block will be orphaned and not returned to the free heap
+ * space. When garbage collection is on, the user must initialize the reference structures to 0 or risk
+ * heap corruption.
+ *
+ * #H5Pset_gc_references sets the garbage collecting references flag.
+ *
+ * \subsection subsec_file_alternate_drivers Alternate File Storage Layouts and Low-level File Drivers
+ * The concept of an HDF5 file is actually rather abstract: the address space for what is normally
+ * thought of as an HDF5 file might correspond to any of the following:
+ * \li Single file on standard file system
+ * \li Multiple files on standard file system
+ * \li Multiple files on parallel file system
+ * \li Block of memory within application’s memory space
+ * \li More abstract situations such as virtual files
+ *
+ * This HDF5 address space is generally referred to as an HDF5 file regardless of its organization at
+ * the storage level.
+ *
+ * HDF5 employs an extremely flexible mechanism called the virtual file layer, or VFL, for file
+ * I/O. A full understanding of the VFL is only necessary if you plan to write your own drivers
+ * @see \ref VFL in the HDF5 Technical Notes.
+ *
+ * For our
+ * purposes here, it is sufficient to know that the low-level drivers used for file I/O reside in the
+ * VFL, as illustrated in the following figure. Note that H5FD_STREAM is not available with 1.8.x
+ * and later versions of the library.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html VFL_Drivers.gif "I/O path from application to VFL and low-level drivers to storage"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * As mentioned above, HDF5 applications access HDF5 files through various low-level file
+ * drivers. The default driver for that layout is the POSIX driver (also known as the SEC2 driver),
+ * #H5FD_SEC2. Alternative layouts and drivers are designed to suit the needs of a variety of
+ * systems, environments, and applications. The drivers are listed in the table below.
+ *
+ * <table>
+ * <caption id="table_file_drivers">Supported file drivers</caption>
+ * <tr>
+ * <th>Driver Name</th>
+ * <th>Driver Identifier</th>
+ * <th>Description</th>
+ * <th>Related API</th>
+ * </tr>
+ * <tr>
+ * <td>POSIX</td>
+ * <td>#H5FD_SEC2</td>
+ * <td>This driver uses POSIX file-system functions like read and write to perform I/O to a single,
+ * permanent file on local disk with no system buffering. This driver is POSIX-compliant and is
+ * the default file driver for all systems.</td>
+ * <td>#H5Pset_fapl_sec2</td>
+ * </tr>
+ * <tr>
+ * <td>Direct</td>
+ * <td>#H5FD_DIRECT</td>
+ * <td>This is the #H5FD_SEC2 driver except data is written to or read from the file
+ * synchronously without being cached by the system.</td>
+ * <td>#H5Pset_fapl_direct</td>
+ * </tr>
+ * <tr>
+ * <td>Log</td>
+ * <td>#H5FD_LOG</td>
+ * <td>This is the #H5FD_SEC2 driver with logging capabilities.</td>
+ * <td>#H5Pset_fapl_log</td>
+ * </tr>
+ * <tr>
+ * <td>Windows</td>
+ * <td>#H5FD_WINDOWS</td>
+ * <td>This driver was modified in HDF5-1.8.8 to be a wrapper of the POSIX driver,
+ * #H5FD_SEC2. This change should not affect user applications.</td>
+ * <td>#H5Pset_fapl_windows</td>
+ * </tr>
+ * <tr>
+ * <td>STDIO</td>
+ * <td>#H5FD_STDIO</td>
+ * <td>This driver uses functions from the standard C stdio.h to perform I/O
+ * to a single, permanent file on local disk with additional system buffering.</td>
+ * <td>#H5Pset_fapl_stdio</td>
+ * </tr>
+ * <tr>
+ * <td>Memory</td>
+ * <td>#H5FD_CORE</td>
+ * <td>With this driver, an application can work with a file in memory for faster reads and
+ * writes. File contents are kept in memory until the file is closed. At closing, the memory
+ * version of the file can be written back to disk or abandoned.</td>
+ * <td>#H5Pset_fapl_core</td>
+ * </tr>
+ * <tr>
+ * <td>Family</td>
+ * <td>#H5FD_FAMILY</td>
+ * <td>With this driver, the HDF5 file’s address space is partitioned into pieces and sent to
+ * separate storage files using an underlying driver of the user’s choice. This driver is for
+ * systems that do not support files larger than 2 gigabytes.</td>
+ * <td>#H5Pset_fapl_family</td>
+ * </tr>
+ * <tr>
+ * <td>Multi</td>
+ * <td>#H5FD_MULTI</td>
+ * <td>With this driver, data can be stored in multiple files according to the type of the data.
+ * I/O might work better if data is stored in separate files based on the type of data. The Split
+ * driver is a special case of this driver.</td>
+ * <td>#H5Pset_fapl_multi</td>
+ * </tr>
+ * <tr>
+ * <td>Split</td>
+ * <td>H5FD_SPLIT</td>
+ * <td>This file driver splits a file into two parts. One part stores metadata, and the other part
+ * stores raw data. This splitting a file into two parts is a limited case of the Multi driver.</td>
+ * <td>#H5Pset_fapl_split</td>
+ * </tr>
+ * <tr>
+ * <td>Parallel</td>
+ * <td>#H5FD_MPIO</td>
+ * <td>This is the standard HDF5 file driver for parallel file systems. This driver uses the MPI
+ * standard for both communication and file I/O.</td>
+ * <td>#H5Pset_fapl_mpio</td>
+ * </tr>
+ * <tr>
+ * <td>Parallel POSIX</td>
+ * <td>H5FD_MPIPOSIX</td>
+ * <td>This driver is no longer available</td>
+ * <td></td>
+ * </tr>
+ * <tr>
+ * <td>Stream</td>
+ * <td>H5FD_STREAM</td>
+ * <td>This driver is no longer available.</td>
+ * <td></td>
+ * </tr>
+ * </table>
+ *
+ * For more information, see the HDF5 Reference Manual entries for the function calls shown in
+ * the column on the right in the table above.
+ *
+ * Note that the low-level file drivers manage alternative file storage layouts. Dataset storage
+ * layouts (chunking, compression, and external dataset storage) are managed independently of file
+ * storage layouts.
+ *
+ * If an application requires a special-purpose low-level driver, the VFL provides a public API for
+ * creating one. For more information on how to create a driver,
+ * @see @ref VFL in the HDF5 Technical Notes.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_id Identifying the Previously‐used File Driver
+ * When creating a new HDF5 file, no history exists, so the file driver must be specified if it is to be
+ * other than the default.
+ *
+ * When opening existing files, however, the application may need to determine which low-level
+ * driver was used to create the file. The function #H5Pget_driver is used for this purpose. See the
+ * example below.
+ *
+ * <em>Identifying a driver</em>
+ * \code
+ * hid_t H5Pget_driver (hid_t fapl_id)
+ * \endcode
+ *
+ * #H5Pget_driver returns a constant identifying the low-level driver for the access property list
+ * fapl_id. For example, if the file was created with the POSIX (aka SEC2) driver,
+ * #H5Pget_driver returns #H5FD_SEC2.
+ *
+ * If the application opens an HDF5 file without both determining the driver used to create the file
+ * and setting up the use of that driver, the HDF5 Library will examine the superblock and the
+ * driver definition block to identify the driver.
+ * See the <a href="https://docs.hdfgroup.org/hdf5/develop/_s_p_e_c.html">HDF5 File Format Specification</a>
+ * for detailed descriptions of the superblock and the driver definition block.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_sec2 The POSIX (aka SEC2) Driver
+ * The POSIX driver, #H5FD_SEC2, uses functions from section 2 of the POSIX manual to access
+ * unbuffered files stored on a local file system. This driver is also known as the SEC2 driver. The
+ * HDF5 Library buffers metadata regardless of the low-level driver, but using this driver prevents
+ * data from being buffered again by the lowest layers of the library.
+ *
+ * The function #H5Pset_fapl_sec2 sets the file access properties to use the POSIX driver. See the
+ * example below.
+ *
+ * <em>Using the POSIX, aka SEC2, driver</em>
+ * \code
+ * herr_t H5Pset_fapl_sec2 (hid_t fapl_id)
+ * \endcode
+ *
+ * Any previously-defined driver properties are erased from the property list.
+ *
+ * Additional parameters may be added to this function in the future. Since there are no additional
+ * variable settings associated with the POSIX driver, there is no H5Pget_fapl_sec2 function.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_direct The Direct Driver
+ * The Direct driver, #H5FD_DIRECT, functions like the POSIX driver except that data is written to
+ * or read from the file synchronously without being cached by the system.
+ *
+ * The functions #H5Pset_fapl_direct and #H5Pget_fapl_direct are used to manage file access properties.
+ * See the example below.
+ *
+ * <em>Using the Direct driver</em>
+ * \code
+ * herr_t H5Pset_fapl_direct(hid_t fapl_id, size_t alignment, size_t block_size, size_t cbuf_size)
+ * herr_t H5Pget_fapl_direct(hid_t fapl_id, size_t *alignment, size_t *block_size, size_t *cbuf_size)
+ * \endcode
+ *
+ * #H5Pset_fapl_direct sets the file access properties to use the Direct driver; any previously defined
+ * driver properties are erased from the property list. #H5Pget_fapl_direct retrieves the file access
+ * properties used with the Direct driver. fapl_id is the file access property list identifier.
+ * alignment is the memory alignment boundary. block_size is the file system block size.
+ * cbuf_size is the copy buffer size.
+ *
+ * Additional parameters may be added to this function in the future.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_log The Log Driver
+ * The Log driver, #H5FD_LOG, is designed for situations where it is necessary to log file access
+ * activity.
+ *
+ * The function #H5Pset_fapl_log is used to manage logging properties. See the example below.
+ *
+ * <em>Logging file access</em>
+ * \code
+ * herr_t H5Pset_fapl_log (hid_t fapl_id, const char *logfile, unsigned int flags, size_t buf_size)
+ * \endcode
+ *
+ * #H5Pset_fapl_log sets the file access property list to use the Log driver. File access characteristics
+ * are identical to access via the POSIX driver. Any previously defined driver properties are erased
+ * from the property list.
+ *
+ * Log records are written to the file logfile.
+ *
+ * The logging levels set with the verbosity parameter are shown in the table below.
+ *
+ * <table>
+ * <caption>Logging levels</caption>
+ * <tr>
+ * <th>Level</th>
+ * <th>Comments</th>
+ * </tr>
+ * <tr>
+ * <td>0</td>
+ * <td>Performs no logging.</td>
+ * </tr>
+ * <tr>
+ * <td>1</td>
+ * <td>Records where writes and reads occur in the file.</td>
+ * </tr>
+ * <tr>
+ * <td>2</td>
+ * <td>Records where writes and reads occur in the file and what kind of data is written
+ * at each location. This includes raw data or any of several types of metadata
+ * (object headers, superblock, B-tree data, local headers, or global headers).</td>
+ * </tr>
+ * </table>
+ *
+ * There is no H5Pget_fapl_log function.
+ *
+ * Additional parameters may be added to this function in the future.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_win The Windows Driver
+ * The Windows driver, #H5FD_WINDOWS, was modified in HDF5-1.8.8 to be a wrapper of the
+ * POSIX driver, #H5FD_SEC2. In other words, if the Windows drivers is used, any file I/O will
+ * instead use the functionality of the POSIX driver. This change should be transparent to all user
+ * applications. The Windows driver used to be the default driver for Windows systems. The
+ * POSIX driver is now the default.
+ *
+ * The function #H5Pset_fapl_windows sets the file access properties to use the Windows driver.
+ * See the example below.
+ *
+ * <em>Using the Windows driver</em>
+ * \code
+ * herr_t H5Pset_fapl_windows (hid_t fapl_id)
+ * \endcode
+ *
+ * Any previously-defined driver properties are erased from the property list.
+ *
+ * Additional parameters may be added to this function in the future. Since there are no additional
+ * variable settings associated with the POSIX driver, there is no H5Pget_fapl_windows function.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_stdio The STDIO Driver
+ * The STDIO driver, #H5FD_STDIO, accesses permanent files in a local file system like the
+ * POSIX driver does. The STDIO driver also has an additional layer of buffering beneath the
+ * HDF5 Library.
+ *
+ * The function #H5Pset_fapl_stdio sets the file access properties to use the STDIO driver. See the
+ * example below.
+ *
+ * <em>Using the STDIO driver</em>
+ * \code
+ * herr_t H5Pset_fapl_stdio (hid_t fapl_id)
+ * \endcode
+ *
+ * Any previously defined driver properties are erased from the property list.
+ *
+ * Additional parameters may be added to this function in the future. Since there are no additional
+ * variable settings associated with the STDIO driver, there is no H5Pget_fapl_stdio function.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_mem The Memory (aka Core) Driver
+ * There are several situations in which it is reasonable, sometimes even required, to maintain a file
+ * entirely in system memory. You might want to do so if, for example, either of the following
+ * conditions apply:
+ * <ul><li>Performance requirements are so stringent that disk latency is a limiting factor</li>
+ * <li>You are working with small, temporary files that will not be retained and, thus,
+ * need not be written to storage media</li></ul>
+ *
+ * The Memory driver, #H5FD_CORE, provides a mechanism for creating and managing such in memory files.
+ * The functions #H5Pset_fapl_core and #H5Pget_fapl_core manage file access
+ * properties. See the example below.
+ *
+ * <em>Managing file access for in-memory files</em>
+ * \code
+ * herr_t H5Pset_fapl_core (hid_t access_properties, size_t block_size, hbool_t backing_store)
+ * herr_t H5Pget_fapl_core (hid_t access_properties, size_t *block_size), hbool_t *backing_store)
+ * \endcode
+ *
+ * #H5Pset_fapl_core sets the file access property list to use the Memory driver; any previously
+ * defined driver properties are erased from the property list.
+ *
+ * Memory for the file will always be allocated in units of the specified block_size.
+ *
+ * The backing_store Boolean flag is set when the in-memory file is created.
+ * backing_store indicates whether to write the file contents to disk when the file is closed. If
+ * backing_store is set to 1 (TRUE), the file contents are flushed to a file with the same name as the
+ * in-memory file when the file is closed or access to the file is terminated in memory. If
+ * backing_store is set to 0 (FALSE), the file is not saved.
+ *
+ * The application is allowed to open an existing file with the #H5FD_CORE driver. While using
+ * #H5Fopen to open an existing file, if backing_store is set to 1 and the flag for #H5Fopen is set to
+ * #H5F_ACC_RDWR, changes to the file contents will be saved to the file when the file is closed.
+ * If backing_store is set to 0 and the flag for #H5Fopen is set to #H5F_ACC_RDWR, changes to the
+ * file contents will be lost when the file is closed. If the flag for #H5Fopen is set to
+ * #H5F_ACC_RDONLY, no change to the file will be allowed either in memory or on file.
+ *
+ * If the file access property list is set to use the Memory driver, #H5Pget_fapl_core will return
+ * block_size and backing_store with the relevant file access property settings.
+ *
+ * Note the following important points regarding in-memory files:
+ * <ul><li>Local temporary files are created and accessed directly from memory without ever
+ * being written to disk</li>
+ * <li>Total file size must not exceed the available virtual memory</li>
+ * <li>Only one HDF5 file identifier can be opened for the file, the identifier returned by
+ * #H5Fcreate or #H5Fopen</li>
+ * <li>The changes to the file will be discarded when access is terminated unless
+ * backing_store is set to 1</li></ul>
+ *
+ * Additional parameters may be added to these functions in the future.
+ *
+ * @see <a href="https://portal.hdfgroup.org/display/HDF5/HDF5+File+Image+Operations">
+ * HDF5 File Image Operations</a>
+ * section for information on more advanced usage of the Memory file driver, and
+ * @see <a href="http://www.hdfgroup.org/HDF5/doc/Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">
+ * Modified Region Writes</a>
+ * section for information on how to set write operations so that only modified regions are written
+ * to storage.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_family The Family Driver
+ * HDF5 files can become quite large, and this can create problems on systems that do not support
+ * files larger than 2 gigabytes. The HDF5 file family mechanism is designed to solve the problems
+ * this creates by splitting the HDF5 file address space across several smaller files. This structure
+ * does not affect how metadata and raw data are stored: they are mixed in the address space just as
+ * they would be in a single, contiguous file.
+ *
+ * HDF5 applications access a family of files via the Family driver, #H5FD_FAMILY. The
+ * functions #H5Pset_fapl_family and #H5Pget_fapl_family are used to manage file family
+ * properties. See the example below.
+ *
+ * <em>Managing file family properties</em>
+ * \code
+ * herr_t H5Pset_fapl_family (hid_t fapl_id,
+ * hsize_t memb_size, hid_t member_properties)
+ * herr_t H5Pget_fapl_family (hid_t fapl_id,
+ * hsize_t *memb_size, hid_t *member_properties)
+ * \endcode
+ *
+ * Each member of the family is the same logical size though the size and disk storage reported by
+ * file system listing tools may be substantially smaller. Examples of file system listing tools are
+ * \code
+ * ls -l
+ * \endcode
+ * on a Unix system or the detailed folder listing on an Apple or Microsoft Windows
+ * system. The name passed to #H5Fcreate or #H5Fopen should include a printf(3c)-style integer
+ * format specifier which will be replaced with the family member number. The first family
+ * member is numbered zero (0).
+ *
+ * #H5Pset_fapl_family sets the access properties to use the Family driver; any previously defined
+ * driver properties are erased from the property list. member_properties will serve as the file
+ * access property list for each member of the file family. memb_size specifies the logical size, in
+ * bytes, of each family member. memb_size is used only when creating a new file or truncating an
+ * existing file; otherwise the member size is determined by the size of the first member of the
+ * family being opened. Note: If the size of the off_t type is four bytes, the maximum family
+ * member size is usually 2^31-1 because the byte at offset 2,147,483,647 is generally inaccessible.
+ *
+ * #H5Pget_fapl_family is used to retrieve file family properties. If the file access property list is set
+ * to use the Family driver, member_properties will be returned with a pointer to a copy of the
+ * appropriate member access property list. If memb_size is non-null, it will contain the logical
+ * size, in bytes, of family members.
+ *
+ * Additional parameters may be added to these functions in the future.
+ *
+ * <h4>Unix Tools and an HDF5 Utility</h4>
+ * It occasionally becomes necessary to repartition a file family. A command-line utility for this
+ * purpose, h5repart, is distributed with the HDF5 library.
+ *
+ * \code
+ * h5repart [-v] [-b block_size[suffix]] [-m member_size[suffix]] source destination
+ * \endcode
+ *
+ * h5repart repartitions an HDF5 file by copying the source file or file family to the destination file
+ * or file family, preserving holes in the underlying UNIX files. Families are used for the source
+ * and/or destination if the name includes a printf-style integer format such as %d. The -v switch
+ * prints input and output file names on the standard error stream for progress monitoring, -b sets
+ * the I/O block size (the default is 1KB), and -m sets the output member size if the destination is a
+ * family name (the default is 1GB). block_size and member_size may be suffixed with the letters
+ * g, m, or k for GB, MB, or KB respectively.
+ *
+ * The h5repart utility is described on the Tools page of the HDF5 Reference Manual.
+ *
+ * An existing HDF5 file can be split into a family of files by running the file through split(1) on a
+ * UNIX system and numbering the output files. However, the HDF5 Library is lazy about
+ * extending the size of family members, so a valid file cannot generally be created by
+ * concatenation of the family members.
+ *
+ * Splitting the file and rejoining the segments by concatenation (split(1) and cat(1) on UNIX
+ * systems) does not generate files with holes; holes are preserved only through the use of h5repart.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_multi The Multi Driver
+ * In some circumstances, it is useful to separate metadata from raw data and some types of
+ * metadata from other types of metadata. Situations that would benefit from use of the Multi driver
+ * include the following:
+ * <ul><li>In networked situations where the small metadata files can be kept on local disks but
+ * larger raw data files must be stored on remote media</li>
+ * <li>In cases where the raw data is extremely large</li>
+ * <li>In situations requiring frequent access to metadata held in RAM while the raw data
+ * can be efficiently held on disk</li></ul>
+ *
+ * In either case, access to the metadata is substantially easier with the smaller, and possibly more
+ * localized, metadata files. This often results in improved application performance.
+ *
+ * The Multi driver, #H5FD_MULTI, provides a mechanism for segregating raw data and different
+ * types of metadata into multiple files. The functions #H5Pset_fapl_multi and
+ * #H5Pget_fapl_multi are used to manage access properties for these multiple files. See the example
+ * below.
+ *
+ * <em>Managing access properties for multiple files</em>
+ * \code
+ * herr_t H5Pset_fapl_multi (hid_t fapl_id, const H5FD_mem_t *memb_map, const hid_t *memb_fapl,
+ * const char * const *memb_name, const haddr_t *memb_addr,
+ * hbool_t relax)
+ * herr_t H5Pget_fapl_multi (hid_t fapl_id, const H5FD_mem_t *memb_map, const hid_t *memb_fapl,
+ * const char **memb_name, const haddr_t *memb_addr, hbool_t *relax)
+ * \endcode
+ *
+ * #H5Pset_fapl_multi sets the file access properties to use the Multi driver; any previously defined
+ * driver properties are erased from the property list. With the Multi driver invoked, the application
+ * will provide a base name to #H5Fopen or #H5Fcreate. The files will be named by that base name as
+ * modified by the rule indicated in memb_name. File access will be governed by the file access
+ * property list memb_properties.
+ *
+ * See #H5Pset_fapl_multi and #H5Pget_fapl_multi in the HDF5 Reference Manual for descriptions
+ * of these functions and their usage.
+ *
+ * Additional parameters may be added to these functions in the future.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_split The Split Driver
+ * The Split driver, H5FD_SPLIT, is a limited case of the Multi driver where only two files are
+ * created. One file holds metadata, and the other file holds raw data.
+ * The function #H5Pset_fapl_split is used to manage Split file access properties. See the example
+ * below.
+ *
+ * <em>Managing access properties for split files</em>
+ * \code
+ * herr_t H5Pset_fapl_split (hid_t access_properties, const char *meta_extension,
+ * hid_t meta_properties,const char *raw_extension, hid_t raw_properties)
+ * \endcode
+ *
+ * #H5Pset_fapl_split sets the file access properties to use the Split driver; any previously defined
+ * driver properties are erased from the property list.
+ *
+ * With the Split driver invoked, the application will provide a base file name such as file_name to
+ * #H5Fcreate or #H5Fopen. The metadata and raw data files in storage will then be named
+ * file_name.meta_extension and file_name.raw_extension, respectively. For example, if
+ * meta_extension is defined as .meta and raw_extension is defined as .raw, the final filenames will
+ * be file_name.meta and file_name.raw.
+ *
+ * Each file can have its own file access property list. This allows the creative use of other lowlevel
+ * file drivers. For instance, the metadata file can be held in RAM and accessed via the
+ * Memory driver while the raw data file is stored on disk and accessed via the POSIX driver.
+ * Metadata file access will be governed by the file access property list in meta_properties. Raw
+ * data file access will be governed by the file access property list in raw_properties.
+ *
+ * Additional parameters may be added to these functions in the future. Since there are no
+ * additional variable settings associated with the Split driver, there is no H5Pget_fapl_split
+ * function.
+ *
+ * \subsubsection subsubsec_file_alternate_drivers_par The Parallel Driver
+ * Parallel environments require a parallel low-level driver. HDF5’s default driver for parallel
+ * systems is called the Parallel driver, #H5FD_MPIO. This driver uses the MPI standard for both
+ * communication and file I/O.
+ *
+ * The functions #H5Pset_fapl_mpio and #H5Pget_fapl_mpio are used to manage file access
+ * properties for the #H5FD_MPIO driver. See the example below.
+ *
+ * <em>Managing parallel file access properties</em>
+ * \code
+ * herr_t H5Pset_fapl_mpio (hid_t fapl_id, MPI_Comm comm, MPI_info info)
+ * herr_t H5Pget_fapl_mpio (hid_t fapl_id, MPI_Comm *comm, MPI_info *info)
+ * \endcode
+ *
+ * The file access properties managed by #H5Pset_fapl_mpio and retrieved by
+ * #H5Pget_fapl_mpio are the MPI communicator, comm, and the MPI info object, info. comm and
+ * info are used for file open. info is an information object much like an HDF5 property list. Both
+ * are defined in MPI_FILE_OPEN of MPI-2.
+ *
+ * The communicator and the info object are saved in the file access property list fapl_id.
+ * fapl_id can then be passed to MPI_FILE_OPEN to create and/or open the file.
+ *
+ * #H5Pset_fapl_mpio and #H5Pget_fapl_mpio are available only in the parallel HDF5 Library and
+ * are not collective functions. The Parallel driver is available only in the parallel HDF5 Library.
+ *
+ * Additional parameters may be added to these functions in the future.
+ *
+ * \subsection subsec_file_examples Code Examples for Opening and Closing Files
+ * \subsubsection subsubsec_file_examples_trunc Example Using the H5F_ACC_TRUNC Flag
+ * The following example uses the #H5F_ACC_TRUNC flag when it creates a new file. The default
+ * file creation and file access properties are also used. Using #H5F_ACC_TRUNC means the
+ * function will look for an existing file with the name specified by the function. In this case, that
+ * name is FILE. If the function does not find an existing file, it will create one. If it does find an
+ * existing file, it will empty the file in preparation for a new set of data. The identifier for the
+ * "new" file will be passed back to the application program.
+ * For more information, @see @ref subsec_file_access_modes.
+ *
+ * <em>Creating a file with default creation and access properties</em>
+ * \code
+ * hid_t file; // identifier
+ *
+ * // Create a new file using H5F_ACC_TRUNC access, default
+ * // file creation properties, and default file access
+ * // properties.
+ * file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * // Close the file.
+ * status = H5Fclose(file);
+ * \endcode
+ *
+ * \subsubsection subsubsec_file_examples_props Example with the File Creation Property List
+ * The example below shows how to create a file with 64-bit object offsets and lengths.
+ *
+ * <em>Creating a file with 64-bit offsets</em>
+ * \code
+ * hid_t create_plist;
+ * hid_t file_id;
+ *
+ * create_plist = H5Pcreate(H5P_FILE_CREATE);
+ * H5Pset_sizes(create_plist, 8, 8);
+ * file_id = H5Fcreate(“test.h5”, H5F_ACC_TRUNC, create_plist, H5P_DEFAULT);
+ * .
+ * .
+ * .
+ *
+ * H5Fclose(file_id);
+ * \endcode
+ *
+ * \subsubsection subsubsec_file_examples_access Example with the File Access Property List
+ * This example shows how to open an existing file for independent datasets access by MPI parallel
+ * I/O:
+ *
+ * <em>Opening an existing file for parallel I/O</em>
+ * \code
+ * hid_t access_plist;
+ * hid_t file_id;
+ *
+ * access_plist = H5Pcreate(H5P_FILE_ACCESS);
+ * H5Pset_fapl_mpi(access_plist, MPI_COMM_WORLD, MPI_INFO_NULL);
+ *
+ * // H5Fopen must be called collectively
+ * file_id = H5Fopen(“test.h5”, H5F_ACC_RDWR, access_plist);
+ * .
+ * .
+ * .
+ *
+ * // H5Fclose must be called collectively
+ * H5Fclose(file_id);
+ * \endcode
+ *
+ * \subsection subsec_file_multiple Working with Multiple HDF5 Files
+ * Multiple HDF5 files can be associated so that the files can be worked with as though all the
+ * information is in a single HDF5 file. A temporary association can be set up by means of the
+ * #H5Fmount function. A permanent association can be set up by means of the external link
+ * function #H5Lcreate_external.
+ *
+ * The purpose of this section is to describe what happens when the #H5Fmount function is used to
+ * mount one file on another.
+ *
+ * When a file is mounted on another, the mounted file is mounted at a group, and the root group of
+ * the mounted file takes the place of that group until the mounted file is unmounted or until the
+ * files are closed.
+ *
+ * The figure below shows two files before one is mounted on the other. File1 has two groups and
+ * three datasets. The group that is the target of the A link has links, Z and Y, to two of the datasets.
+ * The group that is the target of the B link has a link, W, to the other dataset. File2 has three
+ * groups and three datasets. The groups in File2 are the targets of the AA, BB, and CC links. The
+ * datasets in File2 are the targets of the ZZ, YY, and WW links.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Files_fig3.gif "Two separate files"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The figure below shows the two files after File2 has been mounted File1 at the group that is the
+ * target of the B link.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Files_fig4.gif "File2 mounted on File1"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: In the figure above, the dataset that is the target of the W link is not shown. That dataset is
+ * masked by the mounted file.
+ *
+ * If a file is mounted on a group that has members, those members are hidden until the mounted
+ * file is unmounted. There are two ways around this if you need to work with a group member.
+ * One is to mount the file on an empty group. Another is to open the group member before you
+ * mount the file. Opening the group member will return an identifier that you can use to locate the
+ * group member.
+ *
+ * The example below shows how #H5Fmount might be used to mount File2 onto File1.
+ *
+ * <em>Using H5Fmount</em>
+ * \code
+ * status = H5Fmount(loc_id, "/B", child_id, plist_id)
+ * \endcode
+ *
+ * Note: In the code example above, loc_id is the file identifier for File1, /B is the link path to the
+ * group where File2 is mounted, child_id is the file identifier for File2, and plist_id is a property
+ * list identifier.
+ * For more information, @see @ref sec_group.
+ *
+ * See the entries for #H5Fmount, #H5Funmount, and #H5Lcreate_external in the HDF5 Reference Manual.
+ *
+ * Previous Chapter \ref sec_program - Next Chapter \ref sec_group
+ *
+ */
+
+/**
+ * \defgroup H5F Files (H5F)
*
* Use the functions in this module to manage HDF5 files.
*
diff --git a/src/H5Gmodule.h b/src/H5Gmodule.h
index 93e7184..defa5fa 100644
--- a/src/H5Gmodule.h
+++ b/src/H5Gmodule.h
@@ -28,7 +28,929 @@
#define H5_MY_PKG H5G
#define H5_MY_PKG_ERR H5E_SYM
-/** \defgroup H5G H5G
+/** \page H5G_UG HDF5 Groups
+ *
+ * \section sec_group HDF5 Groups
+ * \subsection subsec_group_intro Introduction
+ * As suggested by the name Hierarchical Data Format, an HDF5 file is hierarchically structured.
+ * The HDF5 group and link objects implement this hierarchy.
+ *
+ * In the simple and most common case, the file structure is a tree structure; in the general case, the
+ * file structure may be a directed graph with a designated entry point. The tree structure is very
+ * similar to the file system structures employed on UNIX systems, directories and files, and on
+ * Apple and Microsoft Windows systems, folders and files. HDF5 groups are analogous
+ * to the directories and folders; HDF5 datasets are analogous to the files.
+ *
+ * The one very important difference between the HDF5 file structure and the above-mentioned file
+ * system analogs is that HDF5 groups are linked as a directed graph, allowing circular references;
+ * the file systems are strictly hierarchical, allowing no circular references. The figures below
+ * illustrate the range of possibilities.
+ *
+ * In the first figure below, the group structure is strictly hierarchical, identical to the file system
+ * analogs.
+ *
+ * In the next two figures below, the structure takes advantage of the directed graph’s allowance of
+ * circular references. In the second figure, GroupA is not only a member of the root group, /, but a
+ * member of GroupC. Since Group C is a member of Group B and Group B is a member of Group
+ * A, Dataset1 can be accessed by means of the circular reference /Group A/Group B/Group
+ * C/Group A/Dataset1. The third figure below illustrates an extreme case in which GroupB is a
+ * member of itself, enabling a reference to a member dataset such as /Group A/Group B/Group
+ * B/Group B/Dataset2.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Groups_fig1.gif "A file with a strictly hierarchical group structure"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Groups_fig2.gif "A file with a circular reference"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Groups_fig3.gif "A file with one group as a member of itself"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * As becomes apparent upon reflection, directed graph structures can become quite complex;
+ * caution is advised!
+ *
+ * The balance of this chapter discusses the following topics:
+ * \li The HDF5 group object (or a group) and its structure in more detail
+ * \li HDF5 link objects (or links)
+ * \li The programming model for working with groups and links
+ * \li HDF5 functions provided for working with groups, group members, and links
+ * \li Retrieving information about objects in a group
+ * \li Discovery of the structure of an HDF5 file and the contained objects
+ * \li Examples of file structures
+ *
+ * \subsection subsec_group_descr Description of the Group Object
+ * \subsubsection subsubsec_group_descr_object The Group Object
+ * Abstractly, an HDF5 group contains zero or more objects and every object must be a member of
+ * at least one group. The root group, the sole exception, may not belong to any group.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Groups_fig4.gif "Abstract model of the HDF5 group object"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Group membership is actually implemented via link objects. See the figure above. A link object
+ * is owned by a group and points to a named object. Each link has a name, and each link points to
+ * exactly one object. Each named object has at least one and possibly many links to it.
+ *
+ * There are three classes of named objects: group, dataset, and committed datatype (formerly
+ * called named datatype). See the figure below. Each of these objects is the member of at least one
+ * group, which means there is at least one link to it.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Groups_fig5.gif "Classes of named objects"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The primary operations on a group are to add and remove members and to discover member
+ * objects. These abstract operations, as listed in the figure below, are implemented in the \ref H5G
+ * APIs. For more information, @see @ref subsec_group_function.
+ *
+ * To add and delete members of a group, links from the group to existing objects in the file are
+ * created and deleted with the link and unlink operations. When a new named object is created, the
+ * HDF5 Library executes the link operation in the background immediately after creating the
+ * object (in other words, a new object is added as a member of the group in which it is created
+ * without further user intervention).
+ *
+ * Given the name of an object, the get_object_info method retrieves a description of the object,
+ * including the number of references to it. The iterate method iterates through the members of the
+ * group, returning the name and type of each object.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Groups_fig6.gif "The group object"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Every HDF5 file has a single root group, with the name /. The root group is identical to any other
+ * HDF5 group, except:
+ * \li The root group is automatically created when the HDF5 file is created (#H5Fcreate).
+ * \li The root group has no parent, but by convention has a reference count of 1.
+ * \li The root group cannot be deleted (in other words, unlinked)!
+ *
+ * \subsubsection subsubsec_group_descr_model The Hierarchy of Data Objects
+ * An HDF5 file is organized as a rooted, directed graph using HDF5 group objects. The named
+ * data objects are the nodes of the graph, and the links are the directed arcs. Each arc of the graph
+ * has a name, with the special name / reserved for the root group. New objects are created and then
+ * inserted into the graph with a link operation that is automatically executed by the library;
+ * existing objects are inserted into the graph with a link operation explicitly called by the user,
+ * which creates a named link from a group to the object.
+ *
+ * An object can be the target of more than one link.
+ *
+ * The names on the links must be unique within each group, but there may be many links with the
+ * same name in different groups. These are unambiguous, because some ancestor must have a
+ * different name, or else they are the same object. The graph is navigated with path names,
+ * analogous to Unix file systems. For more information, @see @ref subsubsec_group_descr_path.
+ *
+ * An object can be opened with a full path starting at the root group, or with a relative path and a
+ * starting point. That starting point is always a group, though it may be the current working group,
+ * another specified group, or the root group of the file. Note that all paths are relative to a single
+ * HDF5 file. In this sense, an HDF5 file is analogous to a single UNIX file system.
+ *
+ * It is important to note that, just like the UNIX file system, HDF5 objects do not have names, the
+ * names are associated with paths. An object has an object identifier that is unique within the file,
+ * but a single object may have many names because there may be many paths to the same object.
+ * An object can be renamed, or moved to another group, by adding and deleting links. In this case,
+ * the object itself never moves. For that matter, membership in a group has no implication for the
+ * physical location of the stored object.
+ *
+ * Deleting a link to an object does not necessarily delete the object. The object remains available
+ * as long as there is at least one link to it. After all links to an object are deleted, it can no longer
+ * be opened, and the storage may be reclaimed.
+ *
+ * It is also important to realize that the linking mechanism can be used to construct very complex
+ * graphs of objects. For example, it is possible for an object to be shared between several groups
+ * and even to have more than one name in the same group. It is also possible for a group to be a
+ * member of itself, or to create other cycles in the graph, such as in the case where a child group is
+ * linked to one of its ancestors.
+ *
+ * HDF5 also has soft links similar to UNIX soft links. A soft link is an object that has a name and
+ * a path name for the target object. The soft link can be followed to open the target of the link just
+ * like a regular or hard link. The differences are that the hard link cannot be created if the target
+ * object does not exist and it always points to the same object. A soft link can be created with any
+ * path name, whether or not the object exists; it may or may not, therefore, be possible to follow a
+ * soft link. Furthermore, a soft link’s target object may be changed.
+ *
+ * \subsubsection subsubsec_group_descr_path HDF5 Path Names
+ * The structure of the HDF5 file constitutes the name space for the objects in the file. A path name
+ * is a string of components separated by slashes (/). Each component is the name of a hard or soft
+ * link which points to an object in the file. The slash not only separates the components, but
+ * indicates their hierarchical relationship; the component indicated by the link name following a
+ * slash is a always a member of the component indicated by the link name preceding that slash.
+ *
+ * The first component in the path name may be any of the following:
+ * \li The special character dot (., a period), indicating the current group
+ * \li The special character slash (/), indicating the root group
+ * \li Any member of the current group
+ *
+ * Component link names may be any string of ASCII characters not containing a slash or a dot
+ * (/ and ., which are reserved as noted above). However, users are advised to avoid the use of
+ * punctuation and non-printing characters, as they may create problems for other software. The
+ * figure below provides a BNF grammar for HDF5 path names.
+ *
+ * <em>A BNF grammar for HDF5 path names</em>
+ * \code
+ * PathName ::= AbsolutePathName | RelativePathName
+ * Separator ::= "/" ["/"]*
+ * AbsolutePathName ::= Separator [ RelativePathName ]
+ * RelativePathName ::= Component [ Separator RelativePathName ]*
+ * Component ::= "." | Characters
+ * Characters ::= Character+ - { "." }
+ * Character ::= {c: c Î { { legal ASCII characters } - {'/'} }
+ * \endcode
+ *
+ * An object can always be addressed by either a full or an absolute path name, starting at the root
+ * group, or by a relative path name, starting in a known location such as the current working
+ * group. As noted elsewhere, a given object may have multiple full and relative path names.
+ *
+ * Consider, for example, the file illustrated in the figure below. Dataset1 can be identified by either
+ * of these absolute path names:
+ * <em>/GroupA/Dataset1</em>
+ *
+ * <em>/GroupA/GroupB/GroupC/Dataset1</em>
+ *
+ * Since an HDF5 file is a directed graph structure, and is therefore not limited to a strict tree
+ * structure, and since this illustrated file includes the sort of circular reference that a directed graph
+ * enables, Dataset1 can also be identified by this absolute path name:
+ * <em>/GroupA/GroupB/GroupC/GroupA/Dataset1</em>
+ *
+ * Alternatively, if the current working location is GroupB, Dataset1 can be identified by either of
+ * these relative path names:
+ * <em>GroupC/Dataset1</em>
+ *
+ * <em>GroupC/GroupA/Dataset1</em>
+ *
+ * Note that relative path names in HDF5 do not employ the ../ notation, the UNIX notation
+ * indicating a parent directory, to indicate a parent group.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Groups_fig2.gif "A file with a circular reference"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_group_descr_impl Group Implementations in HDF5
+ * The original HDF5 group implementation provided a single indexed structure for link storage. A
+ * new group implementation, as of HDF5 Release 1.8.0, enables more efficient compact storage
+ * for very small groups, improved link indexing for large groups, and other advanced features.
+ * <ul>
+ * <li>The original indexed format remains the default. Links are stored in a B-tree in the
+ * group’s local heap.</li>
+ * <li>Groups created in the new compact-or-indexed format, the implementation introduced
+ * with Release 1.8.0, can be tuned for performance, switching between the compact and
+ * indexed formats at thresholds set in the user application.
+ * <ul>
+ * <li>The compact format will conserve file space and processing overhead when
+ * working with small groups and is particularly valuable when a group contains
+ * no links. Links are stored as a list of messages in the group’s header.</li>
+ * <li>The indexed format will yield improved performance when working with large
+ * groups. A large group may contain thousands to millions of members. Links
+ * are stored in a fractal heap and indexed with an improved B-tree.</li>
+ * </ul></li>
+ * <li>The new implementation also enables the use of link names consisting of non-ASCII
+ * character sets (see #H5Pset_char_encoding) and is required for all link types other than
+ * hard or soft links; the link types other than hard or soft links are external links and
+ * user-defined links @see @ref H5L APIs.</li>
+ * </ul>
+ *
+ * The original group structure and the newer structures are not directly interoperable. By default, a
+ * group will be created in the original indexed format. An existing group can be changed to a
+ * compact-or-indexed format if the need arises; there is no capability to change back. As stated
+ * above, once in the compact-or-indexed format, a group can switch between compact and indexed
+ * as needed.
+ *
+ * Groups will be initially created in the compact-or-indexed format only when one or more of the
+ * following conditions is met:
+ * <ul>
+ * <li>The low version bound value of the library version bounds property has been set to
+ * Release 1.8.0 or later in the file access property list (see #H5Pset_libver_bounds).
+ * Currently, that would require an #H5Pset_libver_bounds call with the low parameter
+ * set to #H5F_LIBVER_LATEST.
+ *
+ * When this property is set for an HDF5 file, all objects in the file will be created using
+ * the latest available format; no effort will be made to create a file that can be read by
+ * older libraries.</li>
+ * <li>The creation order tracking property, #H5P_CRT_ORDER_TRACKED, has been set
+ * in the group creation property list (see #H5Pset_link_creation_order).</li>
+ * </ul>
+ *
+ * An existing group, currently in the original indexed format, will be converted to the compact-or-
+ * indexed format upon the occurrence of any of the following events:
+ * <ul>
+ * <li>An external or user-defined link is inserted into the group.
+ * <li>A link named with a string composed of non-ASCII characters is inserted into the
+ * group.
+ * </ul>
+ *
+ * The compact-or-indexed format offers performance improvements that will be most notable at
+ * the extremes (for example, in groups with zero members and in groups with tens of thousands of
+ * members). But measurable differences may sometimes appear at a threshold as low as eight
+ * group members. Since these performance thresholds and criteria differ from application to
+ * application, tunable settings are provided to govern the switch between the compact and indexed
+ * formats (see #H5Pset_link_phase_change). Optimal thresholds will depend on the application and
+ * the operating environment.
+ *
+ * Future versions of HDF5 will retain the ability to create, read, write, and manipulate all groups
+ * stored in either the original indexed format or the compact-or-indexed format.
+ *
+ * \subsection subsec_group_h5dump Using h5dump
+ * You can use h5dump, the command-line utility distributed with HDF5, to examine a file for
+ * purposes either of determining where to create an object within an HDF5 file or to verify that
+ * you have created an object in the intended place.
+ *
+ * In the case of the new group created later in this chapter, the following h5dump command will
+ * display the contents of FileA.h5:
+ * \code
+ * h5dump FileA.h5
+ * \endcode
+ *
+ * For more information, @see @ref subsubsec_group_program_create.
+ *
+ * Assuming that the discussed objects, GroupA and GroupB are the only objects that exist in
+ * FileA.h5, the output will look something like the following:
+ * \code
+ * HDF5 "FileA.h5" {
+ * GROUP "/" {
+ * GROUP GroupA {
+ * GROUP GroupB {
+ * }
+ * }
+ * }
+ * }
+ * \endcode
+ *
+ * h5dump is described on the “HDF5 Tools” page of the \ref RM.
+ *
+ * The HDF5 DDL grammar is described in the @ref DDLBNF110.
+ *
+ * \subsection subsec_group_function Group Function Summaries
+ * Functions that can be used with groups (\ref H5G functions) and property list functions that can used
+ * with groups (\ref H5P functions) are listed below. A number of group functions have been
+ * deprecated. Most of these have become link (\ref H5L) or object (\ref H5O) functions. These replacement
+ * functions are also listed below.
+ *
+ * <table>
+ * <caption>Group functions</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Gcreate</td>
+ * <td>Creates a new empty group and gives it a name. The
+ * C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Gcreate_anon</td>
+ * <td>Creates a new empty group without linking it into the file structure.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Gopen</td>
+ * <td>Opens an existing group for modification and returns a group identifier for that group.
+ * The C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Gclose</td>
+ * <td>Closes the specified group.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Gget_create_plist</td>
+ * <td>Gets a group creation property list identifier.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Gget_info</td>
+ * <td>Retrieves information about a group. Use instead of H5Gget_num_objs.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Gget_info_by_idx</td>
+ * <td>Retrieves information about a group according to the group’s position within an index.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Gget_info_by_name</td>
+ * <td>Retrieves information about a group.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>Link and object functions</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Lcreate_hard</td>
+ * <td>Creates a hard link to an object. Replaces H5Glink and H5Glink2.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Lcreate_soft</td>
+ * <td>Creates a soft link to an object. Replaces H5Glink and H5Glink2.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Lcreate_external</td>
+ * <td>Creates a soft link to an object in a different file. Replaces H5Glink and H5Glink2.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Lcreate_ud</td>
+ * <td>Creates a link of a user-defined type.</td>
+ * </tr>
+ * </tr>
+ * <tr>
+ * <td>#H5Lget_val</td>
+ * <td>Returns the value of a symbolic link. Replaces H5Gget_linkval.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Literate</td>
+ * <td>Iterates through links in a group. Replaces H5Giterate.
+ * See also #H5Ovisit and #H5Lvisit.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Literate_by_name</td>
+ * <td>Iterates through links in a group.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Lvisit</td>
+ * <td>Recursively visits all links starting from a specified group.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Ovisit</td>
+ * <td>Recursively visits all objects accessible from a specified object.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Lget_info</td>
+ * <td>Returns information about a link. Replaces H5Gget_objinfo.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Oget_info</td>
+ * <td>Retrieves the metadata for an object specified by an identifier. Replaces H5Gget_objinfo.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Lget_name_by_idx</td>
+ * <td>Retrieves name of the nth link in a group, according to the order within a specified field
+ * or index. Replaces H5Gget_objname_by_idx.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Oget_info_by_idx</td>
+ * <td>Retrieves the metadata for an object, identifying the object by an index position. Replaces
+ * H5Gget_objtype_by_idx.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Oget_info_by_name</td>
+ * <td>Retrieves the metadata for an object, identifying the object by location and relative name.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Oset_comment</td>
+ * <td>Sets the comment for specified object. Replaces H5Gset_comment.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Oget_comment</td>
+ * <td>Gets the comment for specified object. Replaces H5Gget_comment.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Ldelete</td>
+ * <td>Removes a link from a group. Replaces H5Gunlink.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Lmove</td>
+ * <td>Renames a link within an HDF5 file. Replaces H5Gmove and H5Gmove2.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>Group creation property list functions</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pall_filters_avail</td>
+ * <td>Verifies that all required filters are available.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_filter</td>
+ * <td>Returns information about a filter in a pipeline. The
+ * C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_filter_by_id</td>
+ * <td>Returns information about the specified filter. The
+ * C function is a macro: \see \ref api-compat-macros.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_nfilters</td>
+ * <td>Returns the number of filters in the pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pmodify_filter</td>
+ * <td>Modifies a filter in the filter pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Premove_filter</td>
+ * <td>Deletes one or more filters in the filter pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_deflate</td>
+ * <td>Sets the deflate (GNU gzip) compression method and compression level.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_filter</td>
+ * <td>Adds a filter to the filter pipeline.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_fletcher32</td>
+ * <td>Sets up use of the Fletcher32 checksum filter.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_link_phase_change</td>
+ * <td>Sets the parameters for conversion between compact and dense groups.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_link_phase_change</td>
+ * <td>Queries the settings for conversion between compact and dense groups.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_est_link_info</td>
+ * <td>Sets estimated number of links and length of link names in a group.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_est_link_info</td>
+ * <td>Queries data required to estimate required local heap or object header size.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_nlinks</td>
+ * <td>Sets maximum number of soft or user-defined link traversals.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_nlinks</td>
+ * <td>Retrieves the maximum number of link traversals.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_link_creation_order</td>
+ * <td>Sets creation order tracking and indexing for links in a group.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_link_creation_order</td>
+ * <td>Queries whether link creation order is tracked and/or indexed in a group.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_create_intermediate_group</td>
+ * <td>Specifies in the property list whether to create missing intermediate groups.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_create_intermediate_group</td>
+ * <td>Determines whether the property is set to enable creating missing intermediate groups.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_char_encoding</td>
+ * <td>Sets the character encoding used to encode a string. Use to set ASCII or UTF-8 character
+ * encoding for object names.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_char_encoding</td>
+ * <td>Retrieves the character encoding used to create a string.</td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>Other external link functions</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Purpose</th>
+ * </tr>
+ * <tr>
+ * <td>#H5Pset_elink_file_cache_size</td>
+ * <td>Sets the size of the external link open file cache from the specified
+ * file access property list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Pget_elink_file_cache_size</td>
+ * <td>Retrieves the size of the external link open file cache from the specified
+ * file access property list.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5Fclear_elink_file_cache</td>
+ * <td>Clears the external link open file cache for a file.</td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_group_program Programming Model for Groups
+ * The programming model for working with groups is as follows:
+ * <ol><li>Create a new group or open an existing one.</li>
+ * <li>Perform the desired operations on the group.
+ * <ul><li>Create new objects in the group.</li>
+ * <li>Insert existing objects as group members.</li>
+ * <li>Delete existing members.</li>
+ * <li>Open and close member objects.</li>
+ * <li>Access information regarding member objects.</li>
+ * <li>Iterate across group members.</li>
+ * <li>Manipulate links.</li></ul>
+ * <li>Terminate access to the group (Close the group).</li></ol>
+ *
+ * \subsubsection subsubsec_group_program_create Creating a Group
+ * To create a group, use #H5Gcreate, specifying the location and the path of the new group. The
+ * location is the identifier of the file or the group in a file with respect to which the new group is to
+ * be identified. The path is a string that provides either an absolute path or a relative path to the
+ * new group. For more information, @see @ref subsubsec_group_descr_path.
+ *
+ * A path that begins with a slash (/) is
+ * an absolute path indicating that it locates the new group from the root group of the HDF5 file. A
+ * path that begins with any other character is a relative path. When the location is a file, a relative
+ * path is a path from that file’s root group; when the location is a group, a relative path is a path
+ * from that group.
+ *
+ * The sample code in the example below creates three groups. The group Data is created in the
+ * root directory; two groups are then created in /Data, one with absolute path, the other with a
+ * relative path.
+ *
+ * <em>Creating three new groups</em>
+ * \code
+ * hid_t file;
+ * file = H5Fopen(....);
+ *
+ * group = H5Gcreate(file, "/Data", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * group_new1 = H5Gcreate(file, "/Data/Data_new1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * group_new2 = H5Gcreate(group, "Data_new2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ * The third #H5Gcreate parameter optionally specifies how much file space to reserve to store the
+ * names that will appear in this group. If a non-positive value is supplied, a default size is chosen.
+ *
+ * \subsubsection subsubsec_group_program_open Opening a Group and Accessing an Object in that Group
+ * Though it is not always necessary, it is often useful to explicitly open a group when working
+ * with objects in that group. Using the file created in the example above, the example below
+ * illustrates the use of a previously-acquired file identifier and a path relative to that file to open
+ * the group Data.
+ *
+ * Any object in a group can be also accessed by its absolute or relative path. To open an object
+ * using a relative path, an application must first open the group or file on which that relative path
+ * is based. To open an object using an absolute path, the application can use any location identifier
+ * in the same file as the target object; the file identifier is commonly used, but object identifier for
+ * any object in that file will work. Both of these approaches are illustrated in the example below.
+ *
+ * Using the file created in the examples above, the example below provides sample code
+ * illustrating the use of both relative and absolute paths to access an HDF5 data object. The first
+ * sequence (two function calls) uses a previously-acquired file identifier to open the group Data,
+ * and then uses the returned group identifier and a relative path to open the dataset CData. The
+ * second approach (one function call) uses the same previously-acquired file identifier and an
+ * absolute path to open the same dataset.
+ *
+ * <em>Open a dataset with relative and absolute paths</em>
+ * \code
+ * group = H5Gopen(file, "Data", H5P_DEFAULT);
+ *
+ * dataset1 = H5Dopen(group, "CData", H5P_DEFAULT);
+ * dataset2 = H5Dopen(file, "/Data/CData", H5P_DEFAULT);
+ * \endcode
+ *
+ * \subsubsection subsubsec_group_program_dataset Creating a Dataset in a Specific Group
+ * Any dataset must be created in a particular group. As with groups, a dataset may be created in a
+ * particular group by specifying its absolute path or a relative path. The example below illustrates
+ * both approaches to creating a dataset in the group /Data.
+ *
+ * <em> Create a dataset with absolute and relative paths</em>
+ * \code
+ * dataspace = H5Screate_simple(RANK, dims, NULL);
+ * dataset1 = H5Dcreate(file, "/Data/CData", H5T_NATIVE_INT, dataspace,
+ * H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * group = H5Gopen(file, "Data", H5P_DEFAULT);
+ * dataset2 = H5Dcreate(group, "Cdata2", H5T_NATIVE_INT, dataspace,
+ * H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * \subsubsection subsubsec_group_program_close Closing a Group
+ * To ensure the integrity of HDF5 objects and to release system resources, an application should
+ * always call the appropriate close function when it is through working with an HDF5 object. In
+ * the case of groups, H5Gclose ends access to the group and releases any resources the HDF5
+ * library has maintained in support of that access, including the group identifier.
+ *
+ * As illustrated in the example below, all that is required for an H5Gclose call is the group
+ * identifier acquired when the group was opened; there are no relative versus absolute path
+ * considerations.
+ *
+ * <em>Close a group</em>
+ * \code
+ * herr_t status;
+ *
+ * status = H5Gclose(group);
+ * \endcode
+ *
+ * A non-negative return value indicates that the group was successfully closed and the resources
+ * released; a negative return value indicates that the attempt to close the group or release resources
+ * failed.
+ *
+ * \subsubsection subsubsec_group_program_links Creating Links
+ * As previously mentioned, every object is created in a specific group. Once created, an object can
+ * be made a member of additional groups by means of links created with one of the H5Lcreate_*
+ * functions.
+ *
+ * A link is, in effect, a path by which the target object can be accessed; it therefore has a name
+ * which functions as a single path component. A link can be removed with an #H5Ldelete call,
+ * effectively removing the target object from the group that contained the link (assuming, of
+ * course, that the removed link was the only link to the target object in the group).
+ *
+ * <h4>Hard Links</h4>
+ * There are two kinds of links, hard links and symbolic links. Hard links are reference counted;
+ * symbolic links are not. When an object is created, a hard link is automatically created. An object
+ * can be deleted from the file by removing all the hard links to it.
+ *
+ * Working with the file from the previous examples, the code in the example below illustrates the
+ * creation of a hard link, named Data_link, in the root group, /, to the group Data. Once that link is
+ * created, the dataset Cdata can be accessed via either of two absolute paths, /Data/Cdata or
+ * /Data_Link/Cdata.
+ *
+ * <em>Create a hard link</em>
+ * \code
+ * status = H5Lcreate_hard(Data_loc_id, "Data", DataLink_loc_id, "Data_link", H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * dataset1 = H5Dopen(file, "/Data_link/CData", H5P_DEFAULT);
+ * dataset2 = H5Dopen(file, "/Data/CData", H5P_DEFAULT);
+ * \endcode
+ *
+ * The example below shows example code to delete a link, deleting the hard link Data from the
+ * root group. The group /Data and its members are still in the file, but they can no longer be
+ * accessed via a path using the component /Data.
+ *
+ * <em>Delete a link</em>
+ * \code
+ * status = H5Ldelete(Data_loc_id, "Data", H5P_DEFAULT);
+ *
+ * dataset1 = H5Dopen(file, "/Data_link/CData", H5P_DEFAULT);
+ * // This call should succeed; all path components still exist
+ * dataset2 = H5Dopen(file, "/Data/CData", H5P_DEFAULT);
+ * // This call will fail; the path component '/Data' has been deleted.
+ * \endcode
+ *
+ * When the last hard link to an object is deleted, the object is no longer accessible. #H5Ldelete will
+ * not prevent you from deleting the last link to an object. To see if an object has only one link, use
+ * the #H5Oget_info function. If the value of the rc (reference count) field in the is greater than 1,
+ * then the link can be deleted without making the object inaccessible.
+ *
+ * The example below shows #H5Oget_info to the group originally called Data.
+ *
+ * <em>Finding the number of links to an object</em>
+ * \code
+ * status = H5Oget_info(Data_loc_id, object_info);
+ * \endcode
+ *
+ * It is possible to delete the last hard link to an object and not make the object inaccessible.
+ * Suppose your application opens a dataset, and then deletes the last hard link to the dataset. While
+ * the dataset is open, your application still has a connection to the dataset. If your application
+ * creates a hard link to the dataset before it closes the dataset, then the dataset will still be
+ * accessible.
+ *
+ * <h4>Symbolic Links</h4>
+ * Symbolic links are objects that assign a name in a group to a path. Notably, the target object is
+ * determined only when the symbolic link is accessed, and may, in fact, not exist. Symbolic links
+ * are not reference counted, so there may be zero, one, or more symbolic links to an object.
+ *
+ * The major types of symbolic links are soft links and external links. Soft links are symbolic links
+ * within an HDF5 file and are created with the #H5Lcreate_soft function. Symbolic links to objects
+ * located in external files, in other words external links, can be created with the
+ * #H5Lcreate_external function. Symbolic links are removed with the #H5Ldelete function.
+ *
+ * The example below shows the creating two soft links to the group /Data.
+ *
+ * <em>Create a soft link</em>
+ * \code
+ * status = H5Lcreate_soft(path_to_target, link_loc_id, "Soft2", H5P_DEFAULT, H5P_DEFAULT);
+ * status = H5Lcreate_soft(path_to_target, link_loc_id, "Soft3", H5P_DEFAULT, H5P_DEFAULT);
+ * dataset = H5Dopen(file, "/Soft2/CData", H5P_DEFAULT);
+ * \endcode
+ *
+ * With the soft links defined in the example above, the dataset CData in the group /Data can now
+ * be opened with any of the names /Data/CData, /Soft2/CData, or /Soft3/CData.
+ *
+ * In release 1.8.7, a cache was added to hold the names of files accessed via external links. The
+ * size of this cache can be changed to help improve performance. For more information, see the
+ * entry in the \ref RM for the #H5Pset_elink_file_cache_size function call.
+ *
+ * <h4>Note Regarding Hard Links and Soft Links</h4>
+ * Note that an object’s existence in a file is governed by the presence of at least one hard link to
+ * that object. If the last hard link to an object is removed, the object is removed from the file and
+ * any remaining soft link becomes a dangling link, a link whose target object does not exist.
+ *
+ * <h4>Moving or Renaming Objects, and a Warning</h4>
+ * An object can be renamed by changing the name of a link to it with #H5Lmove. This has the same
+ * effect as creating a new link with the new name and deleting the link with the old name.
+ *
+ * Exercise caution in the use of #H5Lmove and #H5Ldelete as these functions each include a step
+ * that unlinks a pointer to an HDF5 object. If the link that is removed is on the only path leading to
+ * an HDF5 object, that object will become permanently inaccessible in the file.
+ *
+ * <h5>Scenario 1: Removing the Last Link</h5>
+ * To avoid removing the last link to an object or otherwise making an object inaccessible, use the
+ * #H5Oget_info function. Make sure that the value of the reference count field (rc) is greater than 1.
+ *
+ * <h5>Scenario 2: Moving a Link that Isolates an Object</h5>
+ * Consider the following example: assume that the group group2 can only be accessed via the
+ * following path, where top_group is a member of the file’s root group:
+ * <em>/top_group/group1/group2/</em>
+ *
+ * Using #H5Lmove, top_group is renamed to be a member ofgroup2. At this point, since
+ * top_group was the only route from the root group to group1, there is no longer a path by which
+ * one can access group1, group2, or any member datasets. And since top_group is now a member
+ * of group2, top_group itself and any member datasets have thereby also become inaccessible.
+ *
+ * <h4>Mounting a File</h4>
+ * An external link is a permanent connection between two files. A temporary connection can be set
+ * up with the #H5Fmount function. For more information, @see sec_file.
+ * For more information, see the #H5Fmount function in the \ref RM.
+ *
+ * \subsubsection subsubsec_group_program_info Discovering Information about Objects
+ * There is often a need to retrieve information about a particular object. The #H5Lget_info and
+ * #H5Oget_info functions fill this niche by returning a description of the object or link in an
+ * #H5L_info_t or #H5O_info_t structure.
+ *
+ * \subsubsection subsubsec_group_program_objs Discovering Objects in a Group
+ * To examine all the objects or links in a group, use the #H5Literate or #H5Ovisit functions to
+ * examine the objects, and use the #H5Lvisit function to examine the links. #H5Literate is useful
+ * both with a single group and in an iterative process that examines an entire file or section of a
+ * file (such as the contents of a group or the contents of all the groups that are members of that
+ * group) and acts on objects as they are encountered. #H5Ovisit recursively visits all objects
+ * accessible from a specified object. #H5Lvisit recursively visits all the links starting from a
+ * specified group.
+ *
+ * \subsubsection subsubsec_group_program_all Discovering All of the Objects in the File
+ * The structure of an HDF5 file is self-describing, meaning that an application can navigate an
+ * HDF5 file to discover and understand all the objects it contains. This is an iterative process
+ * wherein the structure is traversed as a graph, starting at one node and recursively visiting linked
+ * nodes. To explore the entire file, the traversal should start at the root group.
+ *
+ * \subsection subsec_group_examples Examples of File Structures
+ * This section presents several samples of HDF5 file structures.
+ *
+ * Figure 9 shows examples of the structure of a file with three groups and one dataset. The file in
+ * part a contains three groups: the root group and two member groups. In part b, the dataset
+ * dset1 has been created in /group1. In part c, a link named dset2 from /group2 to the dataset has
+ * been added. Note that there is only one copy of the dataset; there are two links to it and it can be
+ * accessed either as /group1/dset1 or as /group2/dset2.
+ *
+ * Part d illustrates that one of the two links to the dataset can be deleted. In this case, the link from
+ * <em>/group1</em>
+ * has been removed. The dataset itself has not been deleted; it is still in the file but can only be
+ * accessed as
+ * <em>/group2/dset2</em>
+ *
+ * <table>
+ * <caption>Figure 9 - Some file structures</caption>
+ * <tr>
+ * <td>
+ * \image html Groups_fig9_a.gif "a) The file contains three groups: the root group, /group1, and /group2."
+ * </td>
+ * <td>
+ * \image html Groups_fig9_b.gif "b) The dataset dset1 (or /group1/dset1) is created in /group1."
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Groups_fig9_aa.gif "c) A link named dset2 to the same dataset is created in /group2."
+ * </td>
+ * <td>
+ * \image html Groups_fig9_bb.gif "d) The link from /group1 to dset1 is removed. The dataset is
+ * still in the file, but can be accessed only as /group2/dset2."
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Figure 10 illustrates loops in an HDF5 file structure. The file in part a contains three groups
+ * and a dataset; group2 is a member of the root group and of the root group’s other member group,
+ * group1. group2 thus can be accessed by either of two paths: /group2 or /group1/GXX. Similarly,
+ * the dataset can be accessed either as /group2/dset1 or as /group1/GXX/dset1.
+ *
+ * Part b illustrates a different case: the dataset is a member of a single group but with two links, or
+ * names, in that group. In this case, the dataset again has two names, /group1/dset1 and
+ * /group1/dset2.
+ *
+ * In part c, the dataset dset1 is a member of two groups, one of which can be accessed by either of
+ * two names. The dataset thus has three path names: /group1/dset1, /group2/dset2, and
+ * /group1/GXX/dset2.
+ *
+ * And in part d, two of the groups are members of each other and the dataset is a member of both
+ * groups. In this case, there are an infinite number of paths to the dataset because GXX and
+ * GYY can be traversed any number of times on the way from the root group, /, to the dataset. This
+ * can yield a path name such as /group1/GXX/GYY/GXX/GYY/GXX/dset2.
+ *
+ * <table>
+ * <caption>Figure 10 - More sample file structures</caption>
+ * <tr>
+ * <td>
+ * \image html Groups_fig10_a.gif "a) dset1 has two names: /group2/dset1 and /group1/GXX/dset1."
+ * </td>
+ * <td>
+ * \image html Groups_fig10_b.gif "b) dset1 again has two names: /group1/dset1 and /group1/dset2."
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Groups_fig10_c.gif "c) dset1 has three names: /group1/dset1, /group2/dset2, and
+ * /group1/GXX/dset2."
+ * </td>
+ * <td>
+ * \image html Groups_fig10_d.gif "d) dset1 has an infinite number of available path names."
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Figure 11 takes us into the realm of soft links. The original file, in part a, contains only three
+ * hard links. In part b, a soft link named dset2 from group2 to /group1/dset1 has been created,
+ * making this dataset accessible as /group2/dset2.
+ *
+ * In part c, another soft link has been created in group2. But this time the soft link, dset3, points
+ * to a target object that does not yet exist. That target object, dset, has been added in part d and is
+ * now accessible as either /group2/dset or /group2/dset3.
+ *
+ * It could be said that HDF5 extends the organizing concepts of a file system to the internal
+ * structure of a single file.
+ *
+ * <table>
+ * <caption>Figure 11 - Hard and soft links</caption>
+ * <tr>
+ * <td>
+ * \image html Groups_fig11_a.gif "a) The file contains only hard links."
+ * </td>
+ * <td>
+ * \image html Groups_fig11_b.gif "b) A soft link is added from group2 to /group1/dset1."
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Groups_fig11_c.gif "c) A soft link named dset3 is added with a target that does not yet exist."
+ * </td>
+ * <td>
+ * \image html Groups_fig11_d.gif "d) The target of the soft link is created or linked."
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Previous Chapter \ref sec_file - Next Chapter \ref sec_dataset
+ *
+ */
+
+/**
+ * \defgroup H5G Groups (H5G)
*
* Use the functions in this module to manage HDF5 groups.
*
diff --git a/src/H5Gpublic.h b/src/H5Gpublic.h
index ce36b84..c659a83 100644
--- a/src/H5Gpublic.h
+++ b/src/H5Gpublic.h
@@ -175,7 +175,7 @@ H5_DLL hid_t H5Gcreate_async(const char *app_file, const char *app_func, unsigne
* H5Gclose() when the group is no longer needed so that resource
* leaks will not develop.
*
- * \see H5Olink(), H5Dcreate(), Using Identifiers
+ * \see H5Olink(), H5Gcreate()
*
* \since 1.8.0
*
@@ -735,7 +735,7 @@ H5_DLL herr_t H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type,
*
* \attention Exercise care in moving groups as it is possible to render data in
* a file inaccessible with H5Gmove(). See The Group Interface in the
- * HDF5 User's Guide.
+ * \ref UG.
*
* \version 1.8.0 Function deprecated in this release.
*
@@ -766,7 +766,7 @@ H5_DLL herr_t H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_na
*
* \attention Exercise care in moving groups as it is possible to render data in
* a file inaccessible with H5Gmove2(). See The Group Interface in the
- * HDF5 User's Guide.
+ * \ref UG.
*
* \version 1.8.0 Function deprecated in this release.
*
@@ -803,11 +803,11 @@ H5_DLL herr_t H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id,
* Note that space identified as freespace is available for re-use only
* as long as the file remains open; once a file has been closed, the
* HDF5 library loses track of freespace. See “Freespace Management” in
- * the HDF5 User's Guide for further details.
+ * the \ref UG for further details.
*
* \attention Exercise care in moving groups as it is possible to render data in
* a file inaccessible with H5Gunlink(). See The Group Interface in the
- * HDF5 User's Guide.
+ * \ref UG.
*
* \version 1.8.0 Function deprecated in this release.
*
diff --git a/src/H5Imodule.h b/src/H5Imodule.h
index cd1cbcd..9470cc9 100644
--- a/src/H5Imodule.h
+++ b/src/H5Imodule.h
@@ -28,7 +28,12 @@
#define H5_MY_PKG H5I
#define H5_MY_PKG_ERR H5E_ID
-/**\defgroup H5I H5I
+/** \page H5I_UG The HDF5 Identifiers
+ * @todo Under Construction
+ */
+
+/**
+ * \defgroup H5I Identifiers (H5I)
*
* Use the functions in this module to manage identifiers defined by the HDF5
* library. See \ref H5IUD for user-defined identifiers and identifier
diff --git a/src/H5Lmodule.h b/src/H5Lmodule.h
index d52690e..cbb5060 100644
--- a/src/H5Lmodule.h
+++ b/src/H5Lmodule.h
@@ -28,7 +28,12 @@
#define H5_MY_PKG H5L
#define H5_MY_PKG_ERR H5E_LINK
-/**\defgroup H5L H5L
+/** \page H5L_UG The HDF5 Links
+ * @todo Under Construction
+ */
+
+/**
+ * \defgroup H5L Links (H5L)
*
* Use the functions in this module to manage HDF5 links and link types.
*
diff --git a/src/H5Mmodule.h b/src/H5Mmodule.h
index e8d7c89..920ec3d 100644
--- a/src/H5Mmodule.h
+++ b/src/H5Mmodule.h
@@ -25,10 +25,24 @@
#define H5_MY_PKG H5M
#define H5_MY_PKG_ERR H5E_MAP
-/**\defgroup H5M H5M
+/**
+ * \page H5M_UG The HDF5 VOL Data Mapping
+ * \Bold{The HDF5 Data Mapping can only be used with the HDF5 VOL connectors that
+ * implement map objects.} The native HDF5 library does not support this feature.
+ *
+ * \section sec_map The HDF5 Map Object
*
* \todo Describe the map life cycle.
*
+ * \todo How does MAPL fit into \ref subsubsec_plist_class.
+ *
+ * Previous Chapter \ref sec_async - Next Chapter \ref sec_addition
+ *
+ */
+
+/**
+ * \defgroup H5M VOL Mapping (H5M)
+ *
* \details \Bold{The interface can only be used with the HDF5 VOL connectors that
* implement map objects.} The native HDF5 library does not support this
* feature.
diff --git a/src/H5Omodule.h b/src/H5Omodule.h
index 18e329c..afb005b 100644
--- a/src/H5Omodule.h
+++ b/src/H5Omodule.h
@@ -28,7 +28,12 @@
#define H5_MY_PKG H5O
#define H5_MY_PKG_ERR H5E_OHDR
-/**\defgroup H5O H5O
+/** \page H5O_UG The HDF5 Objects
+ * @todo Under Construction
+ */
+
+/**
+ * \defgroup H5O Objects (H5O)
*
* Use the functions in this module to manage HDF5 objects.
*
diff --git a/src/H5Opublic.h b/src/H5Opublic.h
index ba352c8..a6cea39 100644
--- a/src/H5Opublic.h
+++ b/src/H5Opublic.h
@@ -311,7 +311,7 @@ H5_DLL hid_t H5Oopen_by_token(hid_t loc_id, H5O_token_t token);
*
* \return \hid_tv{object}
*
- * \details H5Open_by_idx() opens the nth object in the group specified by \p loc_id
+ * \details H5Oopen_by_idx() opens the nth object in the group specified by \p loc_id
* and \p group_name.
*
* \p loc_id specifies a location identifier.
@@ -778,7 +778,7 @@ H5_DLL herr_t H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, hid_
*
* An object’s reference count is the number of hard links in the
* file that point to that object. See the “Programming Model”
- * section of the HDF5 Groups chapter in the -- <em>HDF5 User’s Guide</em>
+ * section of the HDF5 Groups chapter in the -- <em>\ref UG</em>
* for a more complete discussion of reference counts.
*
* If a user application needs to determine an object’s reference
@@ -813,7 +813,7 @@ H5_DLL herr_t H5Oincr_refcount(hid_t object_id);
*
* An object’s reference count is the number of hard links in the
* file that point to that object. See the “Programming Model”
- * section of the HDF5 Groups chapter in the <em>HDF5 User’s Guide</em>
+ * section of the HDF5 Groups chapter in the <em>\ref UG</em>
* for a more complete discussion of reference counts.
*
* If a user application needs to determine an object’s reference
diff --git a/src/H5PLmodule.h b/src/H5PLmodule.h
index 4751a48..9331c86 100644
--- a/src/H5PLmodule.h
+++ b/src/H5PLmodule.h
@@ -2,7 +2,7 @@
* Copyright by The HDF Group. *
* All rights reserved. *
* *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
* distribution tree, or in https://www.hdfgroup.org/licenses. *
@@ -26,7 +26,12 @@
#define H5_MY_PKG H5PL
#define H5_MY_PKG_ERR H5E_PLUGIN
-/**\defgroup H5PL H5PL
+/** \page H5PL_UG The HDF5 Plugins
+ * @todo Under Construction
+ */
+
+/**
+ * \defgroup H5PL Dynamically-loaded Plugins (H5PL)
*
* Use the functions in this module to manage the loading behavior of HDF5
* plugins.
diff --git a/src/H5Pmodule.h b/src/H5Pmodule.h
index d771e6e..d5ef982 100644
--- a/src/H5Pmodule.h
+++ b/src/H5Pmodule.h
@@ -28,7 +28,860 @@
#define H5_MY_PKG H5P
#define H5_MY_PKG_ERR H5E_PLIST
-/**\defgroup H5P H5P
+/** \page H5P_UG Properties and Property Lists in HDF5
+ *
+ * \section sec_plist Properties and Property Lists in HDF5
+ *
+ * HDF5 property lists are the main vehicle to configure the
+ * behavior of HDF5 API functions.
+ *
+ * Typically, property lists are created by instantiating one of the built-in
+ * or user-defined property list classes. After adding suitable properties,
+ * property lists are used when opening or creating HDF5 items, or when reading
+ * or writing data. Property lists can be modified by adding or changing
+ * properties. Property lists are deleted by closing the associated handles.
+ *
+ * \subsection subsec_plist_intro Introduction
+ *
+ * HDF5 properties and property lists make it possible to shape or modify an HDF5 file, group,
+ * dataset, attribute, committed datatype, or even an I/O stream, in a number of ways. For example,
+ * you can do any of the following:
+ * \li Customize the storage layout of a file to suit a project or task.
+ * \li Create a chunked dataset.
+ * \li Apply compression or filters to raw data.
+ * \li Use either ASCII or UTF-8 character encodings.
+ * \li Create missing groups on the fly.
+ * \li Switch between serial and parallel I/O.
+ * \li Create consistency within a single file or across an international project.
+ *
+ * Some properties enable an HDF5 application to take advantage of the capabilities of a specific
+ * computing environment while others make a file more compact; some speed the reading or
+ * writing of data while others enable more record-keeping at a per-object level. HDF5 offers
+ * nearly one hundred specific properties that can be used in literally thousands of combinations to
+ * maximize the usability of HDF5-stored data.
+ *
+ * At the most basic level, a property list is a collection of properties, represented by name/value
+ * pairs that can be passed to various HDF5 functions, usually modifying default settings. A
+ * property list inherits a set of properties and values from a property list class. But that statement
+ * hardly provides a complete picture; in the rest of this section and in the next section,
+ * \ref subsec_plist_class , we will discuss these things in much more detail.
+ * After reading that material, the reader should have a reasonably complete understanding of how
+ * properties and property lists can be used in HDF5 applications.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html PropListEcosystem.gif "The HDF5 property environment"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The remaining sections in this chapter discuss the following topics:
+ * \li What are properties, property lists, and property list classes?
+ * \li Property list programming model
+ * \li Generic property functions
+ * \li Summary listings of property list functions
+ * \li Additional resources
+ *
+ * The discussions and function listings in this chapter focus on general property operations, object
+ * and link properties, and related functions.
+ *
+ * File, group, dataset, datatype, and attribute properties are discussed in the chapters devoted to
+ * those features, where that information will be most convenient to users. For example, \ref sec_dataset
+ * discusses dataset creation property lists and functions, dataset access property lists and
+ * functions, and dataset transfer property lists and functions. This chapter does not duplicate those
+ * discussions.
+ *
+ * Generic property operations are an advanced feature and are beyond the scope of this guide.
+ *
+ * This chapter assumes an understanding of the following chapters of this \ref UG
+ * \li \ref sec_data_model
+ * \li \ref sec_program
+ *
+ * \subsection subsec_plist_class Property List Classes, Property Lists, and Properties
+ *
+ * HDF5 property lists and the property list interface \ref H5P provide a mechanism for storing
+ * characteristics of objects in an HDF5 file and economically passing them around in an HDF5
+ * application. In this capacity, property lists significantly reduce the burden of additional function
+ * parameters throughout the HDF5 API. Another advantage of property lists is that features can
+ * often be added to HDF5 by adding only property list functions to the API; this is particularly true
+ * when all other requirements of the feature can be accomplished internally to the library.
+ *
+ * For instance, a file creation operation needs to know several things about a file, such as the size
+ * of the userblock or the sizes of various file data structures. Bundling this information as a
+ * property list simplifies the interface by reducing the number of parameters to the function
+ * \ref H5Fcreate.
+ *
+ * As illustrated in the figure above ("The HDF5 property environment"), the HDF5 property
+ * environment is a three-level hierarchy:
+ * \li Property list classes
+ * \li Property lists
+ * \li Properties
+ *
+ * The following subsections discuss property list classes, property lists, and properties in more detail.
+ *
+ * \subsubsection subsubsec_plist_class Property List Classes
+ *
+ * A property list class defines the roles that property lists of that class can play. Each class includes
+ * all properties that are valid for that class with each property set to its default value. HDF5 offers
+ * a property lists class for each of the following situations.
+ *
+ * <table>
+ * <caption align=top id="table_plist">Property list classes in HDF5</caption>
+ * <tr><th>Property List Class</th><th></th><th>For further discussion</th></tr>
+ * <tr valign="top">
+ * <td>
+ * File creation (FCPL)
+ * </td>
+ * <td>
+ * \ref H5P_FILE_CREATE
+ * </td>
+ * <td>
+ * See various sections of \ref sec_file
+ * </td>
+ * <tr valign="top">
+ * <td>
+ * File access (FAPL)
+ * </td>
+ * <td>
+ * \ref H5P_FILE_ACCESS
+ * </td>
+ * <td>
+ * Used only as \ref H5P_DEFAULT.
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * File mount (FMPL)
+ * </td>
+ * <td>
+ * \ref H5P_FILE_MOUNT
+ * </td>
+ * <td>
+ * For more information, see \ref FileMountProps "File Mount Properties"
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Object creation (OCPL)
+ * </td>
+ * <td>
+ * \ref H5P_OBJECT_CREATE
+ * </td>
+ * <td>
+ * See \ref OCPL
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Object copy (OCPYPL)
+ * </td>
+ * <td>
+ * \ref H5P_OBJECT_COPY
+ * </td>
+ * <td>
+ *
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Group creation (GCPL)
+ * </td>
+ * <td>
+ * \ref H5P_GROUP_CREATE
+ * </td>
+ * <td>
+ * See \ref subsec_group_program
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Group access (GAPL)
+ * </td>
+ * <td>
+ * \ref H5P_GROUP_ACCESS
+ * </td>
+ * <td>
+ *
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Link creation (LCPL)
+ * </td>
+ * <td>
+ * \ref H5P_LINK_CREATE
+ * </td>
+ * <td>
+ * See examples in \ref subsec_plist_program and \ref LCPL
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Link access (LAPL)
+ * </td>
+ * <td>
+ * \ref H5P_LINK_ACCESS
+ * </td>
+ * <td>
+ *
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Dataset creation (DCPL)
+ * </td>
+ * <td>
+ * \ref H5P_DATASET_CREATE
+ * </td>
+ * <td>
+ * See \ref subsec_dataset_program
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Dataset access (DAPL)
+ * </td>
+ * <td>
+ * \ref H5P_DATASET_ACCESS
+ * </td>
+ * <td>
+ *
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Dataset transfer (DXPL)
+ * </td>
+ * <td>
+ * \ref H5P_DATASET_XFER
+ * </td>
+ * <td>
+ *
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Datatype creation (TCPL)
+ * </td>
+ * <td>
+ * \ref H5P_DATATYPE_CREATE
+ * </td>
+ * <td>
+ * See various sections of \ref sec_datatype
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * String creation (STRCPL)
+ * </td>
+ * <td>
+ * \ref H5P_STRING_CREATE
+ * </td>
+ * <td>
+ * See \ref subsec_dataset_program and \ref subsec_datatype_program
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Attribute creation (ACPL)
+ * </td>
+ * <td>
+ * \ref H5P_ATTRIBUTE_CREATE
+ * </td>
+ * <td>
+ * See \ref subsec_attribute_work.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: In the table above, the abbreviations to the right of each property list class name in this
+ * table are widely used in both HDF5 programmer documentation and HDF5 source code. For
+ * example, \ref FCPL (FCPL) is the file creation property list, \ref OCPL (OCPL) is the object creation
+ * property list, \ref OCPYPL (OCPYPL) is object copy property list, and \ref STRCPL (STRCPL) is the string
+ * creation property list. These abbreviations may appear in either uppercase or lowercase.
+ *
+ * The “HDF5 property list class inheritance hierarchy” figure, immediately following, illustrates
+ * the inheritance hierarchy of HDF5’s property list classes. Properties are defined at the root of the
+ * HDF5 property environment (\ref PLCR in the figure below). Property list
+ * classes then inherit properties from that root, either directly or indirectly through a parent class.
+ * In every case, a property list class inherits only the properties relevant to its role. For example,
+ * the \ref OCPL (OCPL) inherits all properties that are relevant to the
+ * creation of any object while the \ref GCPL (GCPL) inherits only those
+ * properties that are relevant to group creation.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html PropListClassInheritance.gif "HDF5 property list class inheritance hierarchy"
+ * </td>
+ * </tr>
+ * </table>
+ * Note: In the figure above, property list classes displayed in black are directly accessible through
+ * the programming interface; the root of the property environment and the \ref STRCPL and \ref OCPL
+ * property list classes, in gray above, are not user-accessible. The red empty set symbol indicates
+ * that the \ref FMPL (FMPL) is an empty class; that is, it has no set table
+ * properties. For more information, see \ref FileMountProps "File Mount Properties". Abbreviations
+ * used in this figure are defined in the preceding table, \ref table_plist "Property list classes in HDF5".
+ *
+ * \subsubsection subsubsec_plist_lists Property Lists
+ *
+ * A property list is a collection of related properties that are used together in specific
+ * circumstances. A new property list created from a property list class inherits the properties of the
+ * property list class and each property’s default value. A fresh dataset creation property list, for
+ * example, includes all of the HDF5 properties relevant to the creation of a new dataset.
+ *
+ * Property lists are implemented as containers holding a collection of name/value pairs. Each pair
+ * specifies a property name and a value for the property. A property list usually contains
+ * information for one to many properties.
+ *
+ * HDF5’s default property values are designed to be reasonable for general use cases. Therefore,
+ * an application can often use a property list without modification. On the other hand, adjusting
+ * property list settings is a routine action and there are many reasons for an application to do so.
+ *
+ * A new property list may either be derived from a property list class or copied from an existing
+ * property list. When a property list is created from a property list class, it contains all the
+ * properties that are relevant to the class, with each property set to its default value. A new
+ * property list created by copying an existing property list will contain the same properties and
+ * property values as the original property list. In either case, the property values can be changed as
+ * needed through the HDF5 API.
+ *
+ * Property lists can be freely reused to create consistency. For example, a single set of file, group,
+ * and dataset creation property lists might be created at the beginning of a project and used to
+ * create hundreds, thousands, even millions, of consistent files, file structures, and datasets over
+ * the project’s life. When such consistency is important to a project, this is an economical means
+ * of providing it.
+ *
+ * \subsubsection subsubsec_plist_props Properties
+ *
+ * A property is the basic element of the property list hierarchy. HDF5 offers nearly one hundred
+ * properties controlling things ranging from file access rights, to the storage layout of a dataset,
+ * through optimizing the use of a parallel computing environment.
+ *
+ * Further examples include the following:
+ * <table>
+ * <tr><th>Purpose</th><th>Examples</th><th>Property List</th></tr>
+ * <tr valign="top">
+ * <td>
+ * Specify the driver to be used to open a file
+ * </td>
+ * <td>
+ * A POSIX driver or an MPI IO driver
+ * </td>
+ * <td>
+ * \ref FAPL
+ * </td>
+ * <tr valign="top">
+ * <td>
+ * Specify filters to be applied to a dataset
+ * </td>
+ * <td>
+ * Gzip compression or checksum evaluation
+ * </td>
+ * <td>
+ * \ref DCPL
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Specify whether to record key times associated with an object
+ * </td>
+ * <td>
+ * Creation time and/or last-modified time
+ * </td>
+ * <td>
+ * \ref OCPL
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Specify the access mode for a file opened via an external link
+ * </td>
+ * <td>
+ * Read-only or read-write
+ * </td>
+ * <td>
+ * \ref LAPL
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Each property is initialized with a default value. For each property, there are one or more
+ * dedicated H5Pset_*calls that can be used to change that value.
+ *
+ * <h4>Creation, access, and transfer properties:</h4>
+ *
+ * Properties fall into one of several major categories: creation properties, access properties, and
+ * transfer properties.
+ *
+ * Creation properties control permanent object characteristics. These characteristics must be
+ * established when an object is created, cannot change through the life of the object (they are
+ * immutable), and the property setting usually has a permanent presence in the file.
+ *
+ * <table>
+ * <caption align=top>Examples of creation properties include:</caption>
+ * <tr>
+ * <td>
+ * <p>
+ * Whether a dataset is stored in a compact, contiguous, or chunked layout <br />
+ * <br />
+ * The default for this dataset creation property (\ref H5Pset_layout) is that a dataset is
+ * stored in a contiguous block. This works well for datasets with a known size limit that
+ * will fit easily in system memory. <br />
+ * <br />
+ * A chunked layout is important if a dataset is to be compressed, to enable extending
+ * the dataset’s size, or to enable caching during I/O. <br />
+ * <br />
+ * A compact layout is suitable only for very small datasets because the raw data is
+ * stored in the object header.
+ * </p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>
+ * Creation of intermediate groups when adding an object to an HDF5 file<br />
+ * <br />
+ * This link creation property, \ref H5Pset_create_intermediate_group, enables an
+ * application to add an object in a file without having to know that the group or group
+ * hierarchy containing that object already exists. With this property set, HDF5
+ * automatically creates missing groups. If this property is not set, an application must
+ * verify that each group in the path exists, and create those that do not, before creating
+ * the new object; if any group is missing, the create operation will fail.
+ * </p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>
+ * Whether an HDF5 file is a single file or a set of tightly related files that form a virtual
+ * HDF5 file<br />
+ * <br />
+ * Certain file creation properties enable the application to select one of several file
+ * layouts. Examples of the available layouts include a standard POSIX-compliant
+ * layout (\ref H5Pset_fapl_sec2), a family of files (\ref H5Pset_fapl_family), and a split file
+ * layout that separates raw data and metadata into separate files (\ref H5Pset_fapl_split).
+ * These and other file layout options are discussed in \ref subsec_file_alternate_drivers.
+ * </p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>
+ * To enable error detection when creating a dataset<br />
+ * <br />
+ * In settings where data integrity is vulnerable, it may be desirable to set
+ * checksumming when datasets are created (\ref H5Pset_fletcher32). A subsequent
+ * application will then have a means to verify data integrity when reading the dataset.
+ * </p>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Access properties control transient object characteristics. These characteristics may change with
+ * the circumstances under which an object is accessed.
+ *
+ * <table>
+ * <caption align=top>Examples of access properties include:</caption>
+ * <tr>
+ * <td>
+ * <p>
+ * The driver used to open a file<br />
+ * <br />
+ * For example, a file might be created with the MPI I/O driver (\ref H5Pset_fapl_mpio)
+ * during high-speed data acquisition in a parallel computing environment. The same
+ * file might later be analyzed in a serial computing environment with I/O access
+ * handled through the serial POSIX driver (\ref H5Pset_fapl_sec2).
+ * </p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>
+ * Optimization settings in specialized environments<br />
+ * <br />
+ * Optimizations differ across computing environments and according to the needs of
+ * the task being performed, so are transient by nature.
+ * </p>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Transfer properties apply only to datasets and control transient aspects of data I/O. These
+ * characteristics may change with the circumstances under which data is accessed.
+ *
+ * <table>
+ * <caption align=top>Examples of dataset transfer properties include:</caption>
+ * <tr>
+ * <td>
+ * <p>
+ * To enable error detection when reading a dataset<br />
+ * <br />
+ * If checksumming has been set on a dataset (with \ref H5Pset_fletcher32, in the dataset
+ * creation property list), an application reading that dataset can choose whether to check
+ * for data integrity (\ref H5Pset_edc_check).
+ * </p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>
+ * Various properties to optimize chunked data I/O on parallel computing systems<br />
+ * <br />
+ * HDF5 provides several properties for tuning I/O of chunked datasets in a parallel
+ * computing environment (\ref H5Pset_dxpl_mpio_chunk_opt, \ref H5Pset_dxpl_mpio_chunk_opt_num,
+ * \ref H5Pset_dxpl_mpio_chunk_opt_ratio, and \ref H5Pget_mpio_actual_chunk_opt_mode).<br />
+ * <br />
+ * Optimal settings differ due to the characteristics of a computing environment and due
+ * to an application’s data access patterns; even when working with the same file, these
+ * settings might change for every application and every platform.
+ * </p>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_plist_program Programming Model for Properties and Property Lists
+ *
+ * The programming model for HDF5 property lists is actually quite simple:
+ * \li Create a property list.
+ * \li Modify the property list, if required.
+ * \li Use the property list.
+ * \li Close the property list.
+ *
+ * There are nuances, of course, but that is the basic process.
+ *
+ * In some cases, you will not have to define property lists at all. If the default property settings are
+ * sufficient for your application, you can tell HDF5 to use the default property list.
+ *
+ * The following sections first discuss the use of default property lists, then each step of the
+ * programming model, and finally a few less frequently used property list operations.
+ *
+ * \subsubsection subsubsec_plist_default Using Default Property Lists
+ *
+ * Default property lists can simplify many routine HDF5 tasks because you do not always have to
+ * create every property list you use.
+ *
+ * An application that would be well-served by HDF5’s default property settings can use the default
+ * property lists simply by substituting the value \ref H5P_DEFAULT for a property list identifier.
+ * HDF5 will then apply the default property list for the appropriate property list class.
+ *
+ * For example, the function \ref H5Dcreate2 calls for a link creation property list, a dataset creation
+ * property list, and a dataset access property list. If the default properties are suitable for a dataset,
+ * this call can be made as
+ * \code
+ * dset_id = H5Dcreate2( loc_id, name, dtype_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
+ * \endcode
+ * HDF5 will then apply the default link creation, dataset creation, and dataset access property lists
+ * correctly.
+ *
+ * Of course, you would not want to do this without considering where it is appropriate, as there
+ * may be unforeseen consequences. Consider, for example, the use of chunked datasets. Optimal
+ * chunking is quite dependent on the makeup of the dataset and the most common access patterns,
+ * both of which must be taken into account in setting up the size and shape of chunks.
+ *
+ * \subsubsection subsubsec_plist_basic Basic Steps of the Programming Model
+ *
+ * The steps of the property list programming model are described in the sub-sections below.
+ *
+ * <h4>Create a Property List</h4>
+ *
+ * A new property list can be created either as an instance of a property list class or by copying an
+ * existing property list. Consider the following examples. A new dataset creation property list is
+ * first created "from scratch" with \ref H5Pcreate. A second dataset creation property list is then
+ * created by copying the first one with \ref H5Pcopy.
+ *
+ * \code
+ * dcplA_id = H5Pcreate (H5P_DATASET_CREATE);
+ * \endcode
+ *
+ * The new dataset creation property list is created as an instance of the property list class
+ * \ref H5P_DATASET_CREATE.
+ *
+ * The new dataset creation property list’s identifier is returned in dcplA_id and the property list is
+ * initialized with default dataset creation property values.
+ *
+ * A list of valid classes appears in the table \ref table_plist "Property list classes in HDF5".
+ *
+ * \code
+ * dcplB_id = H5Pcopy (dcplA_id);
+ * \endcode
+ *
+ * A new dataset creation property list, dcplB_id, is created as a copy of dcplA_id and is initialized
+ * with dataset creation property values currently in dcplA_id.
+ *
+ * At this point, dcplA_id and dcplB_id are identical; they will both contain any modified property
+ * values that were changed in dcplA_id before dcplB_id was created. They may, however, diverge
+ * as additional property values are reset in each.
+ *
+ * While we are creating property lists, let’s create a link creation property list; we will need this
+ * property list when the new dataset is linked into the file below:
+ * \code
+ * lcplAB_id = H5Pcreate (H5P_LINK_CREATE);
+ * \endcode
+ *
+ * <h4>Change Property Values</h4>
+ *
+ * This section describes how to set property values.
+ *
+ * Later in this section, the dataset creation property lists dcplA_id and dcplB_id created in the
+ * section above will be used respectively to create chunked and contiguous datasets. To set this up,
+ * we must set the layout property in each property list. The following example sets dcplA_id for
+ * chunked datasets and dcplB_id for contiguous datasets:
+ * \code
+ * error = H5Pset_layout (dcplA_id, H5D_CHUNKED);
+ * error = H5Pset_layout (dcplB_id, H5D_CONTIGUOUS);
+ * \endcode
+ *
+ * Since dcplA_id specifies a chunked layout, we must also set the number of dimensions and the
+ * size of the chunks. The example below specifies that datasets created with dcplA_id will be
+ * 3-dimensional and that the chunk size will be 100 in each dimension:
+ * \code
+ * error = H5Pset_chunk (dcplA_id, 3, [100,100,100]);
+ * \endcode
+ *
+ * These datasets will be created with UTF-8 encoded names. To accomplish that, the following
+ * example sets the character encoding property in the link creation property list to create link
+ * names with UTF-8 encoding:
+ * \code
+ * error = H5Pset_char_encoding (lcplAB_id, H5T_CSET_UTF8);
+ * \endcode
+ *
+ * dcplA_id can now be used to create chunked datasets and dcplB_id to create contiguous datasets.
+ * And with the use of lcplAB_id, they will be created with UTF-8 encoded names.
+ *
+ * <h4>Use the Property List</h4>
+ *
+ * Once the required property lists have been created, they can be used to control various HDF5
+ * processes. For illustration, consider dataset creation.
+ *
+ * Assume that the datatype dtypeAB and the dataspaces dspaceA and dspaceB have been defined
+ * and that the location identifier locAB_id specifies the group AB in the current HDF5 file. We
+ * have already created the required link creation and dataset creation property lists.
+ * For the sake of illustration, we assume that the default dataset access property list meets our application
+ * requirements. The following calls would create the datasets dsetA and dsetB in the group AB.
+ * The raw data in dsetA will be contiguous while dsetB raw data will be chunked; both datasets
+ * will have UTF-8 encoded link names:
+ *
+ * \code
+ * dsetA_id = H5Dcreate2( locAB_id, dsetA, dtypeAB, dspaceA_id,
+ * lcplAB_id, dcplA_id, H5P_DEFAULT );
+ * dsetB_id = H5Dcreate2( locAB_id, dsetB, dtypeAB, dspaceB_id,
+ * lcplAB_id, dcplB_id, H5P_DEFAULT );
+ * \endcode
+ *
+ * <h4>Close the Property List</h4>
+ *
+ * Generally, creating or opening anything in an HDF5 file results in an HDF5 identifier. These
+ * identifiers are of HDF5 type hid_t and include things like file identifiers, often expressed as
+ * file_id; dataset identifiers, dset_id; and property list identifiers, plist_id. To reduce the risk of
+ * memory leaks, all of these identifiers must be closed once they are no longer needed.
+ *
+ * Property list identifiers are no exception to this rule, and \ref H5Pclose is used for this purpose. The
+ * calls immediately following would close the property lists created and used in the examples above.
+ *
+ * \code
+ * error = H5Pclose (dcplA_id);
+ * error = H5Pclose (dcplB_id);
+ * error = H5Pclose (lcplAB_id);
+ * \endcode
+ *
+ * \subsubsection subsubsec_plist_additional Additional Property List Operations
+ *
+ * A few property list operations fall outside of the programming model described above. This
+ * section describes those operations.
+ *
+ * <h4>Query the Class of an Existing Property List</h4>
+ *
+ * Occasionally an application will have a property list but not know the corresponding property list
+ * class. A call such as in the following example will retrieve the unknown class of a known property list:
+ * \code
+ * PList_Class = H5Pget_class (dcplA_id);
+ * \endcode
+ *
+ * Upon this function’s return, PList_Class will contain the value \ref H5P_DATASET_CREATE indicating that
+ * dcplA_id is a dataset creation property list.
+
+ * <h4>Determine Current Creation Property List Settings in an Existing Object</h4>
+ *
+ * After a file has been created, another application may work on the file without knowing how the
+ * creation properties for the file were set up. Retrieving these property values is often unnecessary;
+ * HDF5 can read the data and knows how to deal with any properties it encounters.
+ *
+ * But sometimes an application must do something that requires knowing the creation property
+ * settings. HDF5 makes the acquisition of this information fairly straight-forward; for each
+ * property setting call, H5Pset_*, there is a corresponding H5Pget_*call to retrieve the property’s
+ * current setting.
+ *
+ * Consider the following examples which illustrate the determination of dataset layout and chunking settings:
+ *
+ * The application must first identify the creation property list with the appropriate get creation property
+ * list call. There is one such call for each kind of object.
+ *
+ * \ref H5Dget_create_plist will return a property list identifier for the creation property list that was
+ * used to create the dataset. Call it DCPL1_id.
+ *
+ * \ref H5Pset_layout sets a dataset’s layout to be compact, contiguous, or chunked.
+ *
+ * \ref H5Pget_layout called with DCPL1_id will return the dataset’s layout,
+ * either \ref H5D_COMPACT, \ref H5D_CONTIGUOUS, or \ref H5D_CHUNKED.
+ *
+ * \ref H5Pset_chunk sets the rank of a dataset, that is the number of dimensions it will have, and the
+ * maximum size of each dimension.
+ *
+ * \ref H5Pget_chunk, also called with DCPL1_id, will return the rank of the dataset and the maximum
+ * size of each dimension.
+ *
+ * If a creation property value has not been explicitly set, these H5Pget_calls will return the
+ * property’s default value.
+ *
+ * <h4>Determine Access Property Settings</h4>
+ *
+ * Access property settings are quite different from creation properties. Since access property
+ * settings are not retained in an HDF5 file or object, there is normally no knowledge of the settings
+ * that were used in the past. On the other hand, since access properties do not affect characteristics
+ * of the file or object, this is not normally an issue. For more information, see "Access and
+ * Creation Property Exceptions."
+ *
+ * One circumstance under which an application might need to determine access property settings
+ * might be when a file or object is already open but the application does not know the property list
+ * settings. In that case, the application can use the appropriate get access property list
+ * call to retrieve a property list identifier. For example, if the dataset dsetA
+ * from the earlier examples is still open, the following call would return an identifier for the dataset
+ * access property list in use:
+ * \code
+ * dsetA_dacpl_id = H5Dget_access_plist( dsetA_id );
+ * \endcode
+ *
+ * The application could then use the returned property list identifier to analyze the property settings
+ *
+ * \subsection subsec_plist_generic Generic Properties Interface and User-defined Properties
+ *
+ * HDF5’s generic property interface provides tools for managing the entire property hierarchy and
+ * for the creation and management of user-defined property lists and properties. This interface also
+ * makes it possible for an application or a driver to create, modify, and manage custom properties,
+ * property lists, and property list classes. A comprehensive list of functions for this interface
+ * appears under "Generic Property Operations (Advanced)" in the "H5P: Property List Interface"
+ * section of the \ref RM.
+ *
+ * Further discussion of HDF5’s generic property interface and user-defined properties and
+ * property lists is beyond the scope of this document.
+ *
+ * \subsection subsec_plist_H5P Property List Function Summaries
+ *
+ * General property functions, generic property functions and macros, property functions that are
+ * used with multiple types of objects, and object and link property functions are listed below.
+ *
+ * Property list functions that apply to a specific type of object are listed in the chapter that
+ * discusses that object. For example, the \ref sec_dataset chapter has two property list function listings:
+ * one for dataset creation property list functions and one for dataset access property list functions.
+ * As has been stated, this chapter is not intended to describe every property list function.
+ *
+ * \ref H5P reference manual
+ *
+ * \subsection subsec_plist_resources Additional Property List Resources
+ * Property lists are ubiquitous in an HDF5 environment and are therefore discussed in many places
+ * in HDF5 documentation. The following sections and listings in the \ref UG are of
+ * particular interest:
+ * \li In the \ref sec_data_model chapter, see \ref subsubsec_data_model_abstract_plist.
+ * \li In the \ref sec_file chapter, see the following sections and listings:
+ * <ul> <li>\ref subsec_file_creation_access</li>
+ * <li>\ref subsec_file_property_lists</li>
+ * <li>\ref subsubsec_file_examples_props</li>
+ * <li>\ref subsubsec_file_examples_access</li>
+ * <li>"File creation property list functions (H5P)"</li>
+ * <li>"File access property list functions (H5P)"</li>
+ * <li>"File driver functions (H5P)"</li></ul>
+ * \li In the \ref sec_attribute chapter, see "Attribute creation property list functions (H5P)".
+ * \li In the \ref sec_group chapter, see "Group creation property list functions (H5P)".
+ * \li Property lists are discussed throughout \ref sec_dataset.
+ *
+ * All property list functions are described in the \ref H5P section of the
+ * \ref RM. The function index at the top of the page provides a categorized listing
+ * grouped by property list class. Those classes are listed below:
+ * \li File creation properties
+ * \li File access properties
+ * \li Group creation properties
+ * \li Dataset creation properties
+ * \li Dataset access properties
+ * \li Dataset transfer properties
+ * \li Link creation properties
+ * \li Link access properties
+ * \li Object creation properties
+ * \li Object copy properties
+ *
+ * Additional categories not related to the class structure are as follows:
+ * \li General property list operations
+ * \li Generic property list functions
+ *
+ * The general property functions can be used with any property list; the generic property functions
+ * constitute an advanced feature.
+ *
+ * The in-memory file image feature of HDF5 uses property lists in a manner that differs
+ * substantially from their use elsewhere in HDF5. Those who plan to use in-memory file images
+ * must study "File Image Operations" (PDF) in the Advanced Topics in HDF5collection.
+ *
+ * \subsection subsec_plist_notes Notes
+ *
+ * \anchor FileMountProps <h4>File Mount Properties</h4>
+ *
+ * While the file mount property list class \ref H5P_FILE_MOUNT is a valid HDF5 property list class,
+ * no file mount properties are defined by the HDF5 Library. References to a file mount property
+ * list should always be expressed as \ref H5P_DEFAULT, meaning the default file mount property list.
+ *
+ * <h4>Access and Creation Property Exceptions</h4>
+ *
+ * There are a small number of exceptions to the rule that creation properties are always retained in
+ * a file or object and access properties are never retained.
+ *
+ * The following properties are file access properties but they are not transient; they have
+ * permanent and different effects on a file. They could be validly classified as file creation
+ * properties as they must be set at creation time to properly create the file. But they are access
+ * properties because they must also be set when a file is reopened to properly access the file.
+ * <table>
+ * <tr><th>Property</th><th>Related function</th></tr>
+ * <tr valign="top">
+ * <td>
+ * Family file driver
+ * </td>
+ * <td>
+ * \ref H5Pset_fapl_family
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Split file driver
+ * </td>
+ * <td>
+ * \ref H5Pset_fapl_split
+ * </td>
+ * </tr>
+ * <tr valign="top">
+ * <td>
+ * Core file driver
+ * </td>
+ * <td>
+ * \ref H5Pset_fapl_core
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The following is a link creation property, but it is not relevant after an object has been created
+ * and is not retained in the file or object.
+ * <table>
+ * <tr><th>Property</th><th>Related function</th></tr>
+ * <tr valign="top">
+ * <td>
+ * Create missing intermediate groups
+ * </td>
+ * <td>
+ * \ref H5Pset_create_intermediate_group
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Previous Chapter \ref sec_error - Next Chapter \ref sec_vol
+ *
+ * \defgroup H5P Property Lists (H5P)
*
* Use the functions in this module to manage HDF5 property lists and property
* list classes. HDF5 property lists are the main vehicle to configure the
@@ -60,135 +913,118 @@
* </tr>
* </table>
*
- * \defgroup ALCAPL Attribute and Link Creation Properties
- * \ingroup H5P
+ * \defgroup STRCPL String Creation Properties
* Currently, there are only two creation properties that you can use to control
* the creation of HDF5 attributes and links. The first creation property, the
* choice of a character encoding, applies to both attributes and links.
* The second creation property applies to links only, and advises the library
* to automatically create missing intermediate groups when creating new objects.
+ * \ingroup H5P
*
- * \defgroup DAPL Dataset Access Properties
+ * \defgroup LCPL Link Creation Properties
+ * The first creation property, the choice of a character encoding, applies to
+ * both attributes and links.
+ * The second creation property applies to links only, and advises the library
+ * to automatically create missing intermediate groups when creating new objects.
+ * \ingroup STRCPL
+ *
+ * @see STRCPL
+ *
+ * \defgroup ACPL Attribute Creation Properties
+ * The creation property, the choice of a character encoding, applies to attributes.
+ * \ingroup STRCPL
+ *
+ * @see STRCPL
+ *
+ * \defgroup LAPL Link Access Properties
* \ingroup H5P
+ *
+ * \defgroup DAPL Dataset Access Properties
* Use dataset access properties to modify the default behavior of the HDF5
* library when accessing datasets. The properties include adjusting the size
* of the chunk cache, providing prefixes for external content and virtual
* dataset file paths, and controlling flush behavior, etc. These properties
* are \Emph{not} persisted with datasets, and can be adjusted at runtime before
* a dataset is created or opened.
+ * \ingroup LAPL
*
* \defgroup DCPL Dataset Creation Properties
- * \ingroup H5P
* Use dataset creation properties to control aspects of dataset creation such
* as fill time, storage layout, compression methods, etc.
* Unlike dataset access and transfer properties, creation properties \Emph{are}
* stored with the dataset, and cannot be changed once a dataset has been
* created.
+ * \ingroup OCPL
*
* \defgroup DXPL Dataset Transfer Properties
- * \ingroup H5P
* Use dataset transfer properties to customize certain aspects of reading
* and writing datasets such as transformations, MPI-IO I/O mode, error
* detection, etc. These properties are \Emph{not} persisted with datasets,
* and can be adjusted at runtime before a dataset is read or written.
+ * \ingroup H5P
*
* \defgroup FAPL File Access Properties
- * \ingroup H5P
* Use file access properties to modify the default behavior of the HDF5
* library when accessing files. The properties include selecting a virtual
* file driver (VFD), configuring the metadata cache (MDC), control
* file locking, etc. These properties are \Emph{not} persisted with files, and
* can be adjusted at runtime before a file is created or opened.
+ * \ingroup H5P
*
* \defgroup FCPL File Creation Properties
- * \ingroup H5P
* Use file creation properties to control aspects of file creation such
* as setting a file space management strategy or creating a user block.
* Unlike file access properties, creation properties \Emph{are}
* stored with the file, and cannot be changed once a file has been
* created.
+ * \ingroup GCPL
*
* \defgroup GAPL General Access Properties
- * \ingroup H5P
* The functions in this section can be applied to different kinds of property
* lists.
+ * \ingroup LAPL
*
* \defgroup GCPL Group Creation Properties
- * \ingroup H5P
* Use group creation properties to control aspects of group creation such
* as storage layout, compression, and link creation order tracking.
* Unlike file access properties, creation properties \Emph{are}
* stored with the group, and cannot be changed once a group has been
* created.
+ * \ingroup OCPL
*
- * \defgroup GPLO General Property List Operations
- * \ingroup H5P
- *
+ * \defgroup PLCR Property List Class Root
* Use the functions in this module to manage HDF5 property lists.
- *
- * <table>
- * <tr><th>Create</th><th>Read</th></tr>
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5P_examples.c create
- * </td>
- * <td>
- * \snippet{lineno} H5P_examples.c read
- * </td>
- * <tr><th>Update</th><th>Delete</th></tr>
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5P_examples.c update
- * </td>
- * <td>
- * \snippet{lineno} H5P_examples.c delete
- * </td>
- * </tr>
- * </table>
- *
- * \defgroup GPLOA General Property List Operations (Advanced)
* \ingroup H5P
*
+ * \defgroup PLCRA Property List Class Root (Advanced)
* You can create and customize user-defined property list classes using the
* functions described below. Arbitrary user-defined properties can also
* be inserted into existing property lists as so-called temporary properties.
- *
- * <table>
- * <tr><th>Create</th><th>Read</th></tr>
- *
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5P_examples.c create_class
- * </td>
- * <td>
- * \snippet{lineno} H5P_examples.c read_class
- * </td>
- * <tr><th>Update</th><th>Delete</th></tr>
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5P_examples.c update_class
- * </td>
- * <td>
- * \snippet{lineno} H5P_examples.c delete_class
- * </td>
- * </tr>
- * </table>
- *
- * \defgroup LAPL Link Access Properties
* \ingroup H5P
*
*
- * \defgroup MAPL Map Access Properties
- * \ingroup H5P
-
* \defgroup OCPL Object Creation Properties
* \ingroup H5P
*
+ * \defgroup OCPYPL Object Copy Properties
+ * \ingroup H5P
*
- * \defgroup OCPPL Object Copy Properties
+ * \defgroup FMPL File Mount Properties
+ * Empty property class.
* \ingroup H5P
*
*
+ * \defgroup TCPL Datatype Creation Properties
+ * TCPL isn't supported yet.
+ * \ingroup OCPL
+ *
+ *
+ * \defgroup TAPL Datatype Access Properties
+ * TAPL isn't supported yet.
+ * \ingroup LAPL
+ *
+ *
+ *
*/
#endif /* H5Pmodule_H */
diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h
index 8c021f2..5bf2b21 100644
--- a/src/H5Ppublic.h
+++ b/src/H5Ppublic.h
@@ -392,7 +392,7 @@ H5_DLLVAR hid_t H5P_CLS_LINK_ACCESS_ID_g;
H5_DLLVAR hid_t H5P_CLS_VOL_INITIALIZE_ID_g;
H5_DLLVAR hid_t H5P_CLS_REFERENCE_ACCESS_ID_g;
-/* Default roperty list IDs */
+/* Default property list IDs */
/* (Internal to library, do not use! Use macros above) */
H5_DLLVAR hid_t H5P_LST_FILE_CREATE_ID_g;
H5_DLLVAR hid_t H5P_LST_FILE_ACCESS_ID_g;
@@ -421,7 +421,7 @@ H5_DLLVAR hid_t H5P_LST_REFERENCE_ACCESS_ID_g;
/* Generic property list routines */
/**
- * \ingroup GPLO
+ * \ingroup PLCR
*
* \brief Terminates access to a property list
*
@@ -439,7 +439,7 @@ H5_DLLVAR hid_t H5P_LST_REFERENCE_ACCESS_ID_g;
*/
H5_DLL herr_t H5Pclose(hid_t plist_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Closes an existing property list class
*
@@ -456,7 +456,7 @@ H5_DLL herr_t H5Pclose(hid_t plist_id);
*/
H5_DLL herr_t H5Pclose_class(hid_t plist_id);
/**
- * \ingroup GPLO
+ * \ingroup PLCR
*
* \brief Copies an existing property list to create a new property list
*
@@ -473,7 +473,7 @@ H5_DLL herr_t H5Pclose_class(hid_t plist_id);
*/
H5_DLL hid_t H5Pcopy(hid_t plist_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Copies a property from one list or class to another
*
@@ -509,7 +509,7 @@ H5_DLL hid_t H5Pcopy(hid_t plist_id);
*/
H5_DLL herr_t H5Pcopy_prop(hid_t dst_id, hid_t src_id, const char *name);
/**
- * \ingroup GPLO
+ * \ingroup PLCR
*
* \brief Creates a new property list as an instance of a property list class
*
@@ -633,7 +633,7 @@ H5_DLL herr_t H5Pcopy_prop(hid_t dst_id, hid_t src_id, const char *name);
*/
H5_DLL hid_t H5Pcreate(hid_t cls_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Creates a new property list class
*
@@ -676,7 +676,7 @@ H5_DLL hid_t H5Pcreate_class(hid_t parent, const char *name, H5P_cls_create_func
H5P_cls_copy_func_t copy, void *copy_data, H5P_cls_close_func_t close,
void *close_data);
/**
- * \ingroup GPLO
+ * \ingroup PLCR
*
* \brief Decodes property list received in a binary object buffer and
* returns a new property list identifier
@@ -705,7 +705,7 @@ H5_DLL hid_t H5Pcreate_class(hid_t parent, const char *name, H5P_cls_create_func
*/
H5_DLL hid_t H5Pdecode(const void *buf);
/**
- * \ingroup GPLO
+ * \ingroup PLCR
*
* \brief Encodes the property values in a property list into a binary
* buffer
@@ -759,7 +759,7 @@ H5_DLL hid_t H5Pdecode(const void *buf);
*/
H5_DLL herr_t H5Pencode2(hid_t plist_id, void *buf, size_t *nalloc, hid_t fapl_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Compares two property lists or classes for equality
*
@@ -779,7 +779,7 @@ H5_DLL herr_t H5Pencode2(hid_t plist_id, void *buf, size_t *nalloc, hid_t fapl_i
*/
H5_DLL htri_t H5Pequal(hid_t id1, hid_t id2);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Queries whether a property name exists in a property list or
* class
@@ -797,7 +797,7 @@ H5_DLL htri_t H5Pequal(hid_t id1, hid_t id2);
*/
H5_DLL htri_t H5Pexist(hid_t plist_id, const char *name);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Queries the value of a property
*
@@ -829,7 +829,7 @@ H5_DLL htri_t H5Pexist(hid_t plist_id, const char *name);
*/
H5_DLL herr_t H5Pget(hid_t plist_id, const char *name, void *value);
/**
- *\ingroup GPLO
+ * \ingroup PLCR
*
* \brief Returns the property list class identifier for a property list
*
@@ -892,7 +892,7 @@ H5_DLL herr_t H5Pget(hid_t plist_id, const char *name, void *value);
*/
H5_DLL hid_t H5Pget_class(hid_t plist_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Retrieves the name of a class
*
@@ -1036,7 +1036,7 @@ H5_DLL hid_t H5Pget_class(hid_t plist_id);
*/
H5_DLL char *H5Pget_class_name(hid_t pclass_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Retrieves the parent class of a property class
*
@@ -1052,7 +1052,7 @@ H5_DLL char *H5Pget_class_name(hid_t pclass_id);
*/
H5_DLL hid_t H5Pget_class_parent(hid_t pclass_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Queries the number of properties in a property list or class
*
@@ -1075,7 +1075,7 @@ H5_DLL hid_t H5Pget_class_parent(hid_t pclass_id);
*/
H5_DLL herr_t H5Pget_nprops(hid_t id, size_t *nprops);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Queries the size of a property value in bytes
*
@@ -1096,7 +1096,7 @@ H5_DLL herr_t H5Pget_nprops(hid_t id, size_t *nprops);
*/
H5_DLL herr_t H5Pget_size(hid_t id, const char *name, size_t *size);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Registers a temporary property with a property list
*
@@ -1346,7 +1346,7 @@ H5_DLL herr_t H5Pinsert2(hid_t plist_id, const char *name, size_t size, void *va
H5P_prp_get_func_t get, H5P_prp_delete_func_t prp_del, H5P_prp_copy_func_t copy,
H5P_prp_compare_func_t compare, H5P_prp_close_func_t close);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Determines whether a property list is a member of a class
*
@@ -1366,7 +1366,7 @@ H5_DLL herr_t H5Pinsert2(hid_t plist_id, const char *name, size_t size, void *va
*/
H5_DLL htri_t H5Pisa_class(hid_t plist_id, hid_t pclass_id);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Iterates over properties in a property class or list
*
@@ -1412,7 +1412,7 @@ H5_DLL htri_t H5Pisa_class(hid_t plist_id, hid_t pclass_id);
*/
H5_DLL int H5Piterate(hid_t id, int *idx, H5P_iterate_t iter_func, void *iter_data);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Registers a permanent property with a property list class
*
@@ -1693,7 +1693,7 @@ H5_DLL herr_t H5Pregister2(hid_t cls_id, const char *name, size_t size, void *de
H5P_prp_delete_func_t prp_del, H5P_prp_copy_func_t copy,
H5P_prp_compare_func_t compare, H5P_prp_close_func_t close);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Removes a property from a property list
*
@@ -1719,7 +1719,7 @@ H5_DLL herr_t H5Pregister2(hid_t cls_id, const char *name, size_t size, void *de
*/
H5_DLL herr_t H5Premove(hid_t plist_id, const char *name);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Sets a property list value
*
@@ -1751,7 +1751,7 @@ H5_DLL herr_t H5Premove(hid_t plist_id, const char *name);
*/
H5_DLL herr_t H5Pset(hid_t plist_id, const char *name, const void *value);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Removes a property from a property list class
*
@@ -1770,8 +1770,6 @@ H5_DLL herr_t H5Pset(hid_t plist_id, const char *name, const void *value);
*/
H5_DLL herr_t H5Punregister(hid_t pclass_id, const char *name);
-/* Object creation property list (OCPL) routines */
-
/**
* \ingroup DCPL
*
@@ -1791,6 +1789,9 @@ H5_DLL herr_t H5Punregister(hid_t pclass_id, const char *name);
*
*/
H5_DLL htri_t H5Pall_filters_avail(hid_t plist_id);
+
+/* Object creation property list (OCPL) routines */
+
/**
* \ingroup OCPL
*
@@ -8203,7 +8204,7 @@ H5_DLL herr_t H5Pset_dataset_io_hyperslab_selection(hid_t plist_id, unsigned ran
/* Link creation property list (LCPL) routines */
/**
- * \ingroup ALCAPL
+ * \ingroup STRCPL
*
* \brief Determines whether property is set to enable creating missing
* intermediate groups
@@ -8234,7 +8235,7 @@ H5_DLL herr_t H5Pset_dataset_io_hyperslab_selection(hid_t plist_id, unsigned ran
*/
H5_DLL herr_t H5Pget_create_intermediate_group(hid_t plist_id, unsigned *crt_intmd /*out*/);
/**
- * \ingroup ALCAPL
+ * \ingroup STRCPL
*
* \brief Specifies in property list whether to create missing
* intermediate groups
@@ -8618,7 +8619,7 @@ H5_DLL herr_t H5Pget_map_iterate_hints(hid_t mapl_id, size_t *key_prefetch_size
/* String creation property list (STRCPL) routines */
/**
- * \ingroup ALCAPL
+ * \ingroup STRCPL
*
* \brief Retrieves the character encoding used to create a link or
* attribute name
@@ -8647,7 +8648,7 @@ H5_DLL herr_t H5Pget_map_iterate_hints(hid_t mapl_id, size_t *key_prefetch_size
*/
H5_DLL herr_t H5Pget_char_encoding(hid_t plist_id, H5T_cset_t *encoding /*out*/);
/**
- * \ingroup ALCAPL
+ * \ingroup STRCPL
*
* \brief Sets the character encoding used to encode link and attribute
* names
@@ -8688,7 +8689,6 @@ H5_DLL herr_t H5Pget_char_encoding(hid_t plist_id, H5T_cset_t *encoding /*out*/)
*/
H5_DLL herr_t H5Pset_char_encoding(hid_t plist_id, H5T_cset_t encoding);
-/* Link access property list (LAPL) routines */
/**
* \ingroup LAPL
*
@@ -9047,7 +9047,7 @@ H5_DLL herr_t H5Pset_nlinks(hid_t plist_id, size_t nlinks);
/* Object copy property list (OCPYPL) routines */
/**
- * \ingroup OCPPL
+ * \ingroup OCPYPL
*
* \brief Adds a path to the list of paths that will be searched in the
* destination file for a matching committed datatype
@@ -9162,7 +9162,7 @@ H5_DLL herr_t H5Pset_nlinks(hid_t plist_id, size_t nlinks);
*/
H5_DLL herr_t H5Padd_merge_committed_dtype_path(hid_t plist_id, const char *path);
/**
- * \ingroup OCPPL
+ * \ingroup OCPYPL
*
* \brief Clears the list of paths stored in the object copy property list
*
@@ -9213,7 +9213,7 @@ H5_DLL herr_t H5Padd_merge_committed_dtype_path(hid_t plist_id, const char *path
*/
H5_DLL herr_t H5Pfree_merge_committed_dtype_paths(hid_t plist_id);
/**
- * \ingroup OCPPL
+ * \ingroup OCPYPL
*
* \brief Retrieves the properties to be used when an object is copied
*
@@ -9238,7 +9238,7 @@ H5_DLL herr_t H5Pfree_merge_committed_dtype_paths(hid_t plist_id);
*/
H5_DLL herr_t H5Pget_copy_object(hid_t plist_id, unsigned *copy_options /*out*/);
/**
- * \ingroup OCPPL
+ * \ingroup OCPYPL
*
* \brief Retrieves the callback function from the specified object copy
* property list
@@ -9276,7 +9276,7 @@ H5_DLL herr_t H5Pget_copy_object(hid_t plist_id, unsigned *copy_options /*out*/)
*/
H5_DLL herr_t H5Pget_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t *func, void **op_data);
/**
- * \ingroup OCPPL
+ * \ingroup OCPYPL
*
* \brief Sets properties to be used when an object is copied
*
@@ -9369,7 +9369,7 @@ H5_DLL herr_t H5Pget_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t *func,
*/
H5_DLL herr_t H5Pset_copy_object(hid_t plist_id, unsigned copy_options);
/**
- * \ingroup OCPPL
+ * \ingroup OCPYPL
*
* \brief Sets the callback function that H5Ocopy() will invoke before
* searching the entire destination file for a matching committed
@@ -9467,7 +9467,7 @@ H5_DLL herr_t H5Pset_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t func, v
/* Typedefs */
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Registers a permanent property with a property list class
*
@@ -9597,7 +9597,7 @@ H5_DLL herr_t H5Pregister1(hid_t cls_id, const char *name, size_t size, void *de
H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_del,
H5P_prp_copy_func_t prp_copy, H5P_prp_close_func_t prp_close);
/**
- * \ingroup GPLOA
+ * \ingroup PLCRA
*
* \brief Registers a temporary property with a property list
*
@@ -9709,7 +9709,7 @@ H5_DLL herr_t H5Pinsert1(hid_t plist_id, const char *name, size_t size, void *va
H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
H5P_prp_close_func_t prp_close);
/**
- * \ingroup GPLO
+ * \ingroup PLCRA
*
* \brief Encodes the property values in a property list into a binary
* buffer
diff --git a/src/H5Rmodule.h b/src/H5Rmodule.h
index d9ab968..5e3affb 100644
--- a/src/H5Rmodule.h
+++ b/src/H5Rmodule.h
@@ -24,34 +24,17 @@
#define H5_MY_PKG H5R
#define H5_MY_PKG_ERR H5E_REFERENCE
+/** \page H5R_UG The HDF5 References
+ * @todo Under Construction
+ */
+
/**
- * \defgroup H5R H5R
+ * \defgroup H5R References (H5R)
*
* Use the functions in this module to manage HDF5 references. Referents can
* be HDF5 objects, attributes, and selections on datasets a.k.a. dataset
* regions.
*
- *
- * <table>
- * <tr><th>Create</th><th>Read</th></tr>
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5R_examples.c create
- * </td>
- * <td>
- * \snippet{lineno} H5R_examples.c read
- * </td>
- * <tr><th>Update</th><th>Delete</th></tr>
- * <tr valign="top">
- * <td>
- * \snippet{lineno} H5R_examples.c update
- * </td>
- * <td>
- * \snippet{lineno} H5R_examples.c delete
- * </td>
- * </tr>
- * </table>
- *
*/
#endif /* H5Rmodule_H */
diff --git a/src/H5Smodule.h b/src/H5Smodule.h
index 72d722a..73f5953 100644
--- a/src/H5Smodule.h
+++ b/src/H5Smodule.h
@@ -28,7 +28,1494 @@
#define H5_MY_PKG H5S
#define H5_MY_PKG_ERR H5E_DATASPACE
-/**\defgroup H5S H5S
+/** \page H5S_UG Dataspaces and Partial I/O
+ *
+ *
+ * \section sec_dataspace HDF5 Dataspaces and Partial I/O
+ *
+ * HDF5 dataspaces describe the \Emph{shape} of datasets in memory or in HDF5
+ * files. Dataspaces can be empty (#H5S_NULL), a singleton (#H5S_SCALAR), or
+ * a multi-dimensional, regular grid (#H5S_SIMPLE). Dataspaces can be re-shaped.
+ *
+ * Subsets of dataspaces can be "book-marked" or used to restrict I/O operations
+ * using \Emph{selections}. Furthermore, certain set operations are supported
+ * for selections.
+ *
+ * \subsection subsec_dataspace_intro Introduction
+ *
+ * The HDF5 \Emph{dataspace} is a required component of an HDF5 dataset or attribute definition. The dataspace
+ * defines the size and shape of the dataset or attribute raw data. In other words, a dataspace defines the
+ * number of dimensions and the size of each dimension of the multidimensional array in which the raw data
+ * is represented. The dataspace must be defined when the dataset or attribute is created.
+ *
+ * The \Emph{dataspace} is also used during dataset I/O operations, defining the elements of the dataset that
+ * participate in the I/O operation.
+ *
+ * This chapter explains the \Emph{dataspace} object and its use in dataset and attribute creation and data
+ * transfer. It also describes selection operations on a dataspace used to implement sub‐setting,
+ * sub‐sampling, and scatter‐gather access to datasets.
+ *
+ * \subsection subsec_dataspace_function Dataspace Function Summaries
+ * @see H5S reference manual provides a reference list of dataspace functions, the H5S APIs.
+ *
+ * \subsection subsec_dataspace_program Definition of Dataspace Objects and the Dataspace Programming Model
+ *
+ * This section introduces the notion of the HDF5 dataspace object and a programming model for creating
+ * and working with dataspaces.
+ *
+ * \subsubsection subsubsec_dataspace_program_object Dataspace Objects
+ *
+ * An HDF5 dataspace is a required component of an HDF5 dataset or attribute. A dataspace defines the size
+ * and the shape of a dataset’s or an attribute’s raw data. Currently, HDF5 supports the following types of
+ * the dataspaces:
+ * \li Scalar dataspaces
+ * \li Simple dataspaces
+ * \li Null dataspaces
+ *
+ * A scalar dataspace, #H5S_SCALAR, represents just one element, a scalar. Note that the datatype of this one
+ * element may be very complex; example would be a compound structure with members being of any
+ * allowed HDF5 datatype, including multidimensional arrays, strings, and nested compound structures. By
+ * convention, the rank of a scalar dataspace is always 0 (zero); think of it geometrically as a single,
+ * dimensionless point, though that point may be complex.
+ *
+ * A simple dataspace, #H5S_SIMPLE , is a multidimensional array of elements. The dimensionality of the
+ * dataspace (or the rank of the array) is fixed and is defined at creation time. The size of each dimension
+ * can grow during the life time of the dataspace from the current size up to the maximum size. Both the
+ * current size and the maximum size are specified at creation time. The sizes of dimensions at any particular
+ * time in the life of a dataspace are called the current dimensions, or the dataspace extent. They can be
+ * queried along with the maximum sizes.
+ *
+ * A null dataspace, #H5S_NULL, contains no data elements. Note that no selections can be applied to a null
+ * dataset as there is nothing to select.
+ *
+ * As shown in the UML diagram in the figure below, an HDF5 simple dataspace object has three attributes:
+ * the rank or number of dimensions; the current sizes, expressed as an array of length rank with each element
+ * of the array denoting the current size of the corresponding dimension; and the maximum sizes,
+ * expressed as an array of length rank with each element of the array denoting the maximum size of the
+ * corresponding dimension.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_simple.gif "A simple dataspace"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \em Note: A simple dataspace is defined by its rank, the current size of each dimension, and the maximum
+ * size of each dimension.
+ *
+ * The size of a current dimension cannot be greater than the maximum size, which can be unlimited, specified
+ * as #H5S_UNLIMITED. Note that while the HDF5 file format and library impose no maximum size on an
+ * unlimited dimension, practically speaking its size will always be limited to the biggest integer available
+ * on the particular system being used.
+ *
+ * Dataspace rank is restricted to 32, the standard limit in C on the rank of an array, in the current
+ * implementation of the HDF5 Library. The HDF5 file format, on the other hand, allows any rank up to the
+ * maximum integer value on the system, so the library restriction can be raised in the future if higher
+ * dimensionality is required.
+ *
+ * Note that most of the time Fortran applications calling HDF5 will work with dataspaces of rank less than
+ * or equal to seven, since seven is the maximum number of dimensions in a Fortran array. But dataspace rank
+ * is not limited to seven for Fortran applications.
+ *
+ * The current dimensions of a dataspace, also referred to as the dataspace extent, define the bounding box
+ * for dataset elements that can participate in I/O operations.
+ *
+ * \subsubsection subsubsec_dataspace_program_model Dataspace Programming Model
+ *
+ * The programming model for creating and working with HDF5 dataspaces can be summarized as follows:
+ * \li 1. Create a dataspace
+ * \li 2. Use the dataspace to create a dataset in the file or to describe a data array in memory
+ * \li 3. Modify the dataspace to define dataset elements that will participate in I/O operations
+ * \li 4. Use the modified dataspace while reading/writing dataset raw data or to create a region reference
+ * \li 5. Close the dataspace when no longer needed
+ *
+ * The rest of this section will address steps 1, 2, and 5 of the programming model; steps 3 and 4 will be
+ * discussed in later sections of this chapter.
+ *
+ * <h4>Creating a Dataspace</h4>
+ *
+ * A dataspace can be created by calling the \ref H5Screate function. Since the
+ * definition of a simple dataspace requires the specification of dimensionality (or rank) and initial and
+ * maximum dimension sizes, the HDF5 Library provides a convenience API, \ref H5Screate_simple to create a
+ * simple dataspace in one step.
+ *
+ * The following examples illustrate the usage of these APIs.
+ *
+ * <h4>Creating a Scalar Dataspace</h4>
+ *
+ * Creating a Scalar Dataspace
+ * \code
+ * hid_t space_id;
+ * . . .
+ * space_id = H5Screate(H5S_SCALAR);
+ * \endcode
+ * As mentioned above, the dataspace will contain only one element. Scalar dataspaces are used more often
+ * for describing attributes that have just one value. For example, the attribute temperature with the value
+ * Celsius is used to indicate that the dataset with this attribute stores temperature values using the
+ * Celsius scale.
+ *
+ * <h4>Creating a Null Dataspace</h4>
+ *
+ * A null dataspace is created with the \ref H5Screate function.
+ * \code
+ * hid_t space_id;
+ * . . .
+ * space_id = H5Screate(H5S_NULL);
+ * \endcode
+ * As mentioned above, the dataspace will contain no elements.
+ *
+ * <h4>Creating a Simple Dataspace</h4>
+ *
+ * Let’s assume that an application wants to store a two‐dimensional array of data, A(20,100). During the
+ * life of the application, the first dimension of the array can grow up to 30; there is no restriction on
+ * the size of the second dimension. The following steps are used to declare a dataspace for the dataset
+ * in which the array data will be stored.
+ * \code
+ * hid_t space_id;
+ * int rank = 2;
+ * hsize_t current_dims[2] = {20, 100};
+ * hsize_t max_dims[2] = {30, H5S_UNLIMITED};
+ * . . .
+ * space_id = H5Screate(H5S_NULL);
+ * H5Sset_extent_simple(space_id, rank, current_dims, max_dims);
+ * \endcode
+ *
+ * Alternatively, the convenience APIs H5Screate_simple/h5screate_simple_f can replace the
+ * H5Screate/h5screate_f and H5Sset_extent_simple/h5sset_extent_simple_f calls.
+ * \code
+ * space_id = H5Screate_simple(rank, current_dims, max_dims);
+ * \endcode
+ *
+ * In this example, a dataspace with current dimensions of 20 by 100 is created. The first dimension can be
+ * extended only up to 30. The second dimension, however, is declared unlimited; it can be extended up to
+ * the largest available integer value on the system.
+ *
+ * Note that when there is a difference between the current dimensions and the maximum dimensions of an
+ * array, then chunking storage must be used. In other words, if the number of dimensions may change over
+ * the life of the dataset, then chunking must be used. If the array dimensions are fixed (if the number of
+ * current dimensions is equal to the maximum number of dimensions when the dataset is created), then
+ * contiguous storage can be used. For more information, see "Data Transfer".
+ *
+ * Maximum dimensions can be the same as current dimensions. In such a case, the sizes of dimensions
+ * cannot be changed during the life of the dataspace object. In C, \c NULL can be used to indicate to the
+ * \ref H5Screate_simple and \ref H5Sset_extent_simple functions that the maximum sizes of all dimensions
+ * are the same as the current sizes.
+ * \code
+ * space_id = H5Screate_simple(rank, current_dims, NULL);
+ * \endcode
+ * The created dataspace will have current and maximum dimensions of 20 and 100 correspondingly, and the
+ * sizes of those dimensions cannot be changed.
+ *
+ * <h4>C versus Fortran Dataspaces</h4>
+ *
+ * Dataspace dimensions are numbered from 1 to rank. HDF5 uses C storage conventions, assuming that the
+ * last listed dimension is the fastest‐changing dimension and the first‐listed dimension is the slowest
+ * changing. The HDF5 file format storage layout specification adheres to the C convention and the HDF5
+ * Library adheres to the same convention when storing dataspace dimensions in the file. This affects how
+ * C programs and tools interpret data written from Fortran programs and vice versa. The example below
+ * illustrates the issue.
+ *
+ * When a Fortran application describes a dataspace to store an array as A(20,100), it specifies the value of
+ * the first dimension to be 20 and the second to be 100. Since Fortran stores data by columns, the
+ * first‐listed dimension with the value 20 is the fastest‐changing dimension and the last‐listed dimension
+ * with the value 100 is the slowest‐changing. In order to adhere to the HDF5 storage convention, the HDF5
+ * Fortran wrapper transposes dimensions, so the first dimension becomes the last. The dataspace dimensions
+ * stored in the file will be 100,20 instead of 20,100 in order to correctly describe the Fortran data that
+ * is stored in 100 columns, each containing 20 elements.
+ *
+ * When a Fortran application reads the data back, the HDF5 Fortran wrapper transposes the dimensions
+ * once more, returning the first dimension to be 20 and the second to be 100, describing correctly the sizes
+ * of the array that should be used to read data in the Fortran array A(20,100).
+ *
+ * When a C application reads data back, the dimensions will come out as 100 and 20, correctly describing
+ * the size of the array to read data into, since the data was written as 100 records of 20 elements each.
+ * Therefore C tools such as h5dump and h5ls always display transposed dimensions and values for the data
+ * written by a Fortran application.
+ *
+ * Consider the following simple example of equivalent C 3 x 5 and Fortran 5 x 3 arrays. As illustrated in
+ * the figure below, a C application will store a 3 x 5 2‐dimensional array as three 5‐element rows. In order
+ * to store the same data in the same order, a Fortran application must view the array as a 5 x 3 array with
+ * three 5‐element columns. The dataspace of this dataset, as written from Fortran, will therefore be
+ * described as 5 x 3 in the application but stored and described in the file according to the C convention
+ * as a 3 x 5 array. This ensures that C and Fortran applications will always read the data in the order in
+ * which it was written. The HDF5 Fortran interface handles this transposition automatically.
+ * \code
+ * // C
+ * \#define NX 3 // dataset dimensions
+ * \#define NY 5
+ * . . .
+ * int data[NX][NY]; // data to write
+ * . . .
+ * // Data and output buffer initialization.
+ * for (j = 0; j < NX; j++)
+ * for (i = 0; i < NY; i++)
+ * data[j][i] = i + j;
+ * //
+ * // 1 2 3 4 5
+ * // 6 7 8 9 10
+ * // 11 12 13 14 15
+ * //
+ * . . .
+ * dims[0] = NX;
+ * dims[1] = NY;
+ * dataspace = H5Screate_simple(RANK, dims, NULL);
+ * \endcode
+ *
+ * \code
+ * ! Fortran
+ * INTEGER, PARAMETER :: NX = 3
+ * INTEGER, PARAMETER :: NX = 5
+ * . . .
+ * INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/NY, NX/) ! Dataset dimensions
+ * . . .
+ * !
+ * ! Initialize data
+ * !
+ * do i = 1, NY
+ * do j = 1, NX
+ * data(i,j) = i + (j-1)*NY
+ * enddo
+ * enddo
+ * !
+ * ! Data
+ * !
+ * ! 1 6 11
+ * ! 2 7 12
+ * ! 3 8 13
+ * ! 4 9 14
+ * ! 5 10 15
+ * . . .
+ * CALL h5screate_simple_f(rank, dims, dspace_id, error)
+ * \endcode
+ *
+ * <table>
+ * <caption align=top>Comparing C and Fortran dataspaces</caption>
+ * <tr>
+ * <td>
+ * A dataset stored by a C program in a 3 x 5 array:
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dspace_CvsF1.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * The same dataset stored by a Fortran program in a 5 x 3 array:
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dspace_CvsF2.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * The first dataset above as written to an HDF5 file from C or the second dataset above as written
+ * from Fortran:
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dspace_CvsF3.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * The first dataset above as written to an HDF5 file from Fortran:
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dspace_CvsF4.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <em>Note: The HDF5 Library stores arrays along the fastest‐changing dimension. This approach is often
+ * referred to as being “in C order.” C, C++, and Java work with arrays in row‐major order. In other words,
+ * the row, or the last dimension, is the fastest‐changing dimension. Fortran, on the other hand, handles
+ * arrays in column‐major order making the column, or the first dimension, the fastest‐changing dimension.
+ * Therefore, the C and Fortran arrays illustrated in the top portion of this figure are stored identically
+ * in an HDF5 file. This ensures that data written by any language can be meaningfully read, interpreted,
+ * and manipulated by any other.</em>
+ *
+ * <h4>Finding Dataspace Characteristics</h4>
+ *
+ * The HDF5 Library provides several APIs designed to query the characteristics of a dataspace.
+ *
+ * The function \ref H5Sis_simple returns information about the type of a dataspace.
+ * This function is rarely used and currently supports only simple and scalar dataspaces.
+ *
+ * To find out the dimensionality, or rank, of a dataspace, use \ref H5Sget_simple_extent_ndims.
+ * \ref H5Sget_simple_extent_dims can also be used to find out the rank. See
+ * the example below. If both functions return 0 for the value of rank, then the dataspace is scalar.
+ *
+ * To query the sizes of the current and maximum dimensions, use \ref H5Sget_simple_extent_dims.
+ *
+ * The following example illustrates querying the rank and dimensions of a dataspace using these functions.
+ * \code
+ * hid_t space_id;
+ * int rank;
+ * hsize_t *current_dims;
+ * hsize_t *max_dims;
+ * . . .
+ * rank = H5Sget_simple_extent_ndims(space_id);
+ * // (or rank = H5Sget_simple_extent_dims(space_id, NULL, NULL);)
+ * current_dims = (hsize_t)malloc(rank * sizeof(hsize_t));
+ * max_dims = (hsize_t)malloc(rank * sizeof(hsize_t));
+ * H5Sget_simple_extent_dims(space_id, current_dims, max_dims);
+ * // Print values here
+ * \endcode
+ *
+ * \subsection subsec_dataspace_transfer Dataspaces and Data Transfer
+ *
+ * Read and write operations transfer data between an HDF5 file on disk and in memory. The shape that the
+ * array data takes in the file and in memory may be the same, but HDF5 also allows users the ability to
+ * represent data in memory in a different shape than in the file. If the shape of an array in the file and
+ * in memory will be the same, then the same dataspace definition can be used for both. If the shape of an
+ * array in memory needs to be different than the shape in the file, then the dataspace definition for the
+ * shape of the array in memory can be changed. During a read operation, the array will be read into the
+ * different shape in memory, and during a write operation, the array will be written to the file in the
+ * shape specified by the dataspace in the file. The only qualification is that the number of elements read
+ * or written must be the same in both the source and the destination dataspaces.
+ *
+ * Item a in the figure below shows a simple example of a read operation in which the data is stored as a 3
+ * by 4 array in the file (item b) on disk, but the program wants it to be a 4 by 3 array in memory. This is
+ * accomplished by setting the memory dataspace to describe the desired memory layout, as in item c. The read
+ * operation reads the data in the file array into the memory array.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_read.gif "Data layout before and after a read operation"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_move.gif "Moving data from disk to memory"
+ * </td>
+ * </tr>
+ * </table>
+
+ * Both the source and destination are stored as contiguous blocks of storage with the elements in the order
+ * specified by the dataspace. The figure above shows one way the elements might be organized. In item a,
+ * the elements are stored as 3 blocks of 4 elements. The destination is an array of 12 elements in memory
+ * (see item c). As the figure suggests, the transfer reads the disk blocks into a memory buffer (see item b),
+ * and then writes the elements to the correct locations in memory. A similar process occurs in reverse when
+ * data is written to disk.
+ *
+ * \subsubsection subsubsec_dataspace_transfer_select Data Selection
+ *
+ * In addition to rearranging data, the transfer may select the data elements from the source and destination.
+ *
+ * Data selection is implemented by creating a dataspace object that describes the selected elements (within
+ * the hyper rectangle) rather than the whole array. Two dataspace objects with selections can be used in
+ * data transfers to read selected elements from the source and write selected elements to the destination.
+ * When data is transferred using the dataspace object, only the selected elements will be transferred.
+ *
+ * This can be used to implement partial I/O, including:
+ * \li Sub‐setting ‐ reading part of a large dataset
+ * \li Sampling ‐ reading selected elements (for example, every second element) of a dataset
+ * \li Scatter‐gather ‐ read non‐contiguous elements into contiguous locations (gather) or read contiguous
+ * elements into non‐contiguous locations (scatter) or both
+ *
+ * To use selections, the following steps are followed:
+ * \li 1. Get or define the dataspace for the source and destination
+ * \li 2. Specify one or more selections for source and destination dataspaces
+ * \li 3. Transfer data using the dataspaces with selections
+ *
+ * A selection is created by applying one or more selections to a dataspace. A selection may override any
+ * other selections (#H5S_SELECT_SET) or may be “Ored” with previous selections on the same dataspace
+ * (#H5S_SELECT_OR). In the latter case, the resulting selection is the union of the selection and all
+ * previously selected selections. Arbitrary sets of points from a dataspace can be selected by specifying
+ * an appropriate set of selections.
+ *
+ * Two selections are used in data transfer, so the source and destination must be compatible, as described
+ * below.
+ *
+ * There are two forms of selection, hyperslab and point. A selection must be either a point selection or a
+ * set of hyperslab selections. Selections cannot be mixed.
+ *
+ * The definition of a selection within a dataspace, not the data in the selection, cannot be saved to the
+ * file unless the selection definition is saved as a region reference. For more information,
+ * see \ref subsec_dataspace_refer.
+ *
+ * <h4>Hyperslab Selection</h4>
+ *
+ * A hyperslab is a selection of elements from a hyper rectangle. An HDF5 hyperslab is a rectangular pattern
+ * defined by four arrays. The four arrays are summarized in the table below.
+ *
+ * The offset defines the origin of the hyperslab in the original dataspace.
+ *
+ * The stride is the number of elements to increment between selected elements. A stride of ‘1’ is every
+ * element, a stride of ‘2’ is every second element, etc. Note that there may be a different stride for
+ * each dimen‐sion of the dataspace. The default stride is 1.
+ *
+ * The count is the number of elements in the hyperslab selection. When the stride is 1, the selection is a
+ * hyper rectangle with a corner at the offset and size count[0] by count[1] by.... When stride is greater
+ * than one, the hyperslab bounded by the offset and the corners defined by stride[n] * count[n].
+ *
+ * <table>
+ * <caption align=top>Hyperslab elements</caption>
+ * <tr>
+ * <th>
+ * Parameter
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * Offset
+ * </td>
+ * <td>
+ * The starting location for the hyperslab.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Stride
+ * </td>
+ * <td>
+ * The number of elements to separate each element or block to be selected.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Count
+ * </td>
+ * <td>
+ * The number of elements or blocks to select along each dimension.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Block
+ * </td>
+ * <td>
+ * The size of the block selected from the dataspace.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The block is a count on the number of repetitions of the hyperslab. The default block size is '1', which is
+ * one hyperslab. A block of 2 would be two hyperslabs in that dimension, with the second starting at
+ * offset[n] + (count[n] * stride[n]) + 1.
+ *
+ * A hyperslab can be used to access a sub‐set of a large dataset. The figure below shows an example of a
+ * hyperslab that reads a rectangle from the middle of a larger two dimensional array. The destination is the
+ * same shape as the source.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_subset.gif "Access a sub‐set of data with a hyperslab"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Hyperslabs can be combined to select complex regions of the source and destination. The figure below
+ * shows an example of a transfer from one non‐rectangular region into another non‐rectangular region. The
+ * source is defined as the union of two hyperslabs, and the destination is the union of three hyperslabs.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_complex.gif "Build complex regions with hyperslab unions"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Hyperslabs may also be used to collect or scatter data from regular patterns. The figure below shows an
+ * example where the source is a repeating pattern of blocks, and the destination is a single, one dimensional
+ * array.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_combine.gif "Use hyperslabs to combine or disperse data"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Select Points</h4>
+ *
+ * The second type of selection is an array of points such as coordinates. Essentially, this selection is a
+ * list of all the points to include. The figure below shows an example of a transfer of seven elements from
+ * a two dimensional dataspace to a three dimensional dataspace using a point selection to specify the points.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_point.gif "Point selection"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Rules for Defining Selections</h4>
+ *
+ * A selection must have the same number of dimensions (rank) as the dataspace it is applied to, although it
+ * may select from only a small region such as a plane from a 3D dataspace. Selections do not affect the
+ * extent of the dataspace, the selection may be larger than the dataspace. The boundaries of selections are
+ * reconciled with the extent at the time of the data transfer.
+ *
+ * <h4>Data Transfer with Selections</h4>
+ *
+ * A data transfer (read or write) with selections is the same as any read or write, except the source
+ * and destination dataspace have compatible selections.
+ *
+ * During the data transfer, the following steps are executed by the library:
+ * \li The source and destination dataspaces are checked to assure that the selections are compatible.
+ * <ul><li>Each selection must be within the current extent of the dataspace. A selection may be
+ * defined to extend outside the current extent of the dataspace, but the dataspace cannot be
+ * accessed if the selection is not valid at the time of the access.</li>
+ * <li> The total number of points selected in the source and destination must be the same. Note
+ * that the dimensionality of the source and destination can be different (for example, the
+ * source could be 2D, the destination 1D or 3D), and the shape can be different, but the number of
+ * elements selected must be the same.</li></ul>
+ * \li The data is transferred, element by element.
+ *
+ * Selections have an iteration order for the points selected, which can be any permutation of the dimensions
+ * involved (defaulting to 'C' array order) or a specific order for the selected points, for selections
+ * composed of single array elements with \ref H5Sselect_elements.
+ *
+ * The elements of the selections are transferred in row‐major, or C order. That is, it is assumed that the
+ * first dimension varies slowest, the second next slowest, and so forth. For hyperslab selections, the order
+ * can be any permutation of the dimensions involved (defaulting to ‘C’ array order). When multiple hyperslabs
+ * are combined, the hyperslabs are coalesced into contiguous reads and writes.
+ *
+ * In the case of point selections, the points are read and written in the order specified.
+ *
+ * \subsubsection subsubsec_dataspace_transfer_model Programming Model
+ *
+ * <h4>Selecting Hyperslabs</h4>
+ *
+ * Suppose we want to read a 3x4 hyperslab from a dataset in a file beginning at the element <1,2> in the
+ * dataset, and read it into a 7 x 7 x 3 array in memory. See the figure below. In order to do this, we must
+ * create a dataspace that describes the overall rank and dimensions of the dataset in the file as well as
+ * the position and size of the hyperslab that we are extracting from that dataset.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_select.gif "Selecting a hyperslab"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The code in the first example below illustrates the selection of the hyperslab in the file dataspace.
+ * The second example below shows the definition of the destination dataspace in memory. Since the in‐memory
+ * dataspace has three dimensions, the hyperslab is an array with three dimensions with the last dimension
+ * being 1: <3,4,1>. The third example below shows the read using the source and destination dataspaces
+ * with selections.
+ *
+ * <em>Selecting a hyperslab</em>
+ * \code
+ * //get the file dataspace.
+ * dataspace = H5Dget_space(dataset); // dataspace identifier
+ *
+ * // Define hyperslab in the dataset.
+ * offset[0] = 1;
+ * offset[1] = 2;
+ * count[0] = 3;
+ * count[1] = 4;
+ * status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, NULL, count, NULL);
+ * \endcode
+ *
+ * <em>Defining the destination memory</em>
+ * \code
+ * // Define memory dataspace.
+ * dimsm[0] = 7;
+ * dimsm[1] = 7;
+ * dimsm[2] = 3;
+ * memspace = H5Screate_simple(3,dimsm,NULL);
+ *
+ * // Define memory hyperslab.
+ * offset_out[0] = 3;
+ * offset_out[1] = 0;
+ * offset_out[2] = 0;
+ * count_out[0] = 3;
+ * count_out[1] = 4;
+ * count_out[2] = 1;
+ * status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, offset_out, NULL, count_out, NULL);
+ * \endcode
+ *
+ * <em>A sample read specifying source and destination dataspaces</em>
+ * \code
+ * ret = H5Dread(dataset, H5T_NATIVE_INT, memspace,dataspace, H5P_DEFAULT, data);
+ * \endcode
+ *
+ * <h4>Example with Strides and Blocks</h4>
+ *
+ * Consider an 8 x 12 dataspace into which we want to write eight 3 x 2 blocks in a two dimensional array
+ * from a source dataspace in memory that is a 50‐element one dimensional array. See the figure below.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_write1to2.gif "Write from a one dimensional array to a two dimensional array"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The example below shows code to write 48 elements from the one dimensional array to the file dataset
+ * starting with the second element in vector. The destination hyperslab has the following parameters:
+ * offset=(0,1), stride=(4,3), count=(2,4), block=(3,2). The source has the parameters: offset=(1),
+ * stride=(1), count=(48), block=(1). After these operations, the file dataspace will have the values
+ * shown in item b in the figure above. Notice that the values are inserted in the file dataset in
+ * row‐major order.
+ *
+ * <em>Write from a one dimensional array to a two dimensional array</em>
+ * \code
+ * // Select hyperslab for the dataset in the file, using 3 x 2 blocks, (4,3) stride (2,4)
+ * // count starting at the position (0,1).
+ * offset[0] = 0; offset[1] = 1;
+ * stride[0] = 4; stride[1] = 3;
+ * count[0] = 2; count[1] = 4;
+ * block[0] = 3; block[1] = 2;
+ * ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, offset, stride, count, block);
+ *
+ * // Create dataspace for the first dataset.
+ * mid1 = H5Screate_simple(MSPACE1_RANK, dim1, NULL);
+ *
+ * // Select hyperslab.
+ * // We will use 48 elements of the vector buffer starting
+ * // at the second element. Selected elements are
+ * // 1 2 3 . . . 48
+ * offset[0] = 1;
+ * stride[0] = 1;
+ * count[0] = 48;
+ * block[0] = 1;
+ * ret = H5Sselect_hyperslab(mid1, H5S_SELECT_SET, offset, stride, count, block);
+ *
+ * // Write selection from the vector buffer to the dataset in the file.
+ * ret = H5Dwrite(dataset, H5T_NATIVE_INT, midd1, fid, H5P_DEFAULT, vector)
+ * \endcode
+ *
+ * <h4>Selecting a Union of Hyperslabs</h4>
+ *
+ * The HDF5 Library allows the user to select a union of hyperslabs and write or read the selection into
+ * another selection. The shapes of the two selections may differ, but the number of elements must be
+ * equal.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_transfer.gif "Transferring hyperslab unions"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The figure above shows the transfer of a selection that is two overlapping hyperslabs from the dataset
+ * into a union of hyperslabs in the memory dataset. Note that the destination dataset has a different shape
+ * from the source dataset. Similarly, the selection in the memory dataset could have a different shape than
+ * the selected union of hyperslabs in the original file. For simplicity, the selection is that same shape
+ * at the destination.
+ *
+ * To implement this transfer, it is necessary to:
+ * \li 1. Get the source dataspace
+ * \li 2. Define one hyperslab selection for the source
+ * \li 3. Define a second hyperslab selection, unioned with the first
+ * \li 4. Get the destination dataspace
+ * \li 5. Define one hyperslab selection for the destination
+ * \li 6. Define a second hyperslab selection, unioned with the first
+ * \li 7. Execute the data transfer (H5Dread or H5Dwrite) using the source and destination dataspaces
+ *
+ * The example below shows example code to create the selections for the source dataspace (the file). The
+ * first hyperslab is size 3 x 4 and the left upper corner at the position (1,2). The hyperslab is a simple
+ * rectangle, so the stride and block are 1. The second hyperslab is 6 x 5 at the position (2,4). The second
+ * selection is a union with the first hyperslab (#H5S_SELECT_OR).
+ *
+ * <em> Select source hyperslabs</em>
+ * \code
+ * fid = H5Dget_space(dataset);
+ *
+ * // Select first hyperslab for the dataset in the file.
+ * offset[0] = 1; offset[1] = 2;
+ * block[0] = 1; block[1] = 1;
+ * stride[0] = 1; stride[1] = 1;
+ * count[0] = 3; count[1] = 4;
+ * ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, offset, stride, count, block);
+ *
+ * // Add second selected hyperslab to the selection.
+ * offset[0] = 2; offset[1] = 4;
+ * block[0] = 1; block[1] = 1;
+ * stride[0] = 1; stride[1] = 1;
+ * count[0] = 6; count[1] = 5;
+ * ret = H5Sselect_hyperslab(fid, H5S_SELECT_OR, offset, stride, count, block);
+ * \endcode
+ *
+ * The example below shows example code to create the selection for the destination in memory. The steps
+ * are similar. In this example, the hyperslabs are the same shape, but located in different positions in the
+ * dataspace. The first hyperslab is 3 x 4 and starts at (0,0), and the second is 6 x 5 and starts at (1,2).
+ * Finally, the H5Dread call transfers the selected data from the file dataspace to the selection in memory.
+ * In this example, the source and destination selections are two overlapping rectangles. In general, any
+ * number of rectangles can be OR’ed, and they do not have to be contiguous. The order of the selections
+ * does not matter, but the first should use #H5S_SELECT_SET ; subsequent selections are unioned using
+ * #H5S_SELECT_OR.
+ *
+ * It is important to emphasize that the source and destination do not have to be the same shape (or number
+ * of rectangles). As long as the two selections have the same number of elements, the data can be
+ * transferred.
+ *
+ * <em>Select destination hyperslabs</em>
+ * \code
+ * // Create memory dataspace.
+ * mid = H5Screate_simple(MSPACE_RANK, mdim, NULL);
+ *
+ * // Select two hyperslabs in memory. Hyperslabs has the
+ * // same size and shape as the selected hyperslabs for
+ * // the file dataspace.
+ * offset[0] = 0; offset[1] = 0;
+ * block[0] = 1; block[1] = 1;
+ * stride[0] = 1; stride[1] = 1;
+ * count[0] = 3; count[1] = 4;
+ * ret = H5Sselect_hyperslab(mid, H5S_SELECT_SET, offset, stride, count, block);
+ *
+ * offset[0] = 1; offset[1] = 2;
+ * block[0] = 1; block[1] = 1;
+ * stride[0] = 1; stride[1] = 1;
+ * count[0] = 6; count[1] = 5;
+ * ret = H5Sselect_hyperslab(mid, H5S_SELECT_OR, offset, stride, count, block);
+ *
+ * ret = H5Dread(dataset, H5T_NATIVE_INT, mid, fid, H5P_DEFAULT, matrix_out);
+ * \endcode
+ *
+ * <h4>Selecting a List of Independent Points</h4>
+ *
+ * It is also possible to specify a list of elements to read or write using the function H5Sselect_elements.
+ *
+ * The procedure is similar to hyperslab selections.
+ * \li 1. Get the source dataspace
+ * \li 2. Set the selected points
+ * \li 3. Get the destination dataspace
+ * \li 4. Set the selected points
+ * \li 5. Transfer the data using the source and destination dataspaces
+ *
+ * The figure below shows an example where four values are to be written to four separate points in a two
+ * dimensional dataspace. The source dataspace is a one dimensional array with the values 53, 59, 61, 67.
+ * The destination dataspace is an 8 x 12 array. The elements are to be written to the points
+ * (0,0), (3,3), (3,5), and (5,6). In this example, the source does not require a selection. The example
+ * below the figure shows example code to implement this transfer.
+ *
+ * A point selection lists the exact points to be transferred and the order they will be transferred. The
+ * source and destination are required to have the same number of elements. A point selection can be used
+ * with a hyperslab (for example, the source could be a point selection and the destination a hyperslab,
+ * or vice versa), so long as the number of elements selected are the same.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_separate.gif "Write data to separate points"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <em>Write data to separate points</em>
+ * \code
+ * hsize_t dim2[] = {4};
+ * int values[] = {53, 59, 61, 67};
+ *
+ * // file dataspace
+ * hssize_t coord[4][2];
+ *
+ * // Create dataspace for the second dataset.
+ * mid2 = H5Screate_simple(1, dim2, NULL);
+ *
+ * // Select sequence of NPOINTS points in the file dataspace.
+ * coord[0][0] = 0; coord[0][1] = 0;
+ * coord[1][0] = 3; coord[1][1] = 3;
+ * coord[2][0] = 3; coord[2][1] = 5;
+ * coord[3][0] = 5; coord[3][1] = 6;
+ *
+ * ret = H5Sselect_elements(fid, H5S_SELECT_SET, NPOINTS, (const hssize_t **)coord);
+ *
+ * ret = H5Dwrite(dataset, H5T_NATIVE_INT, mid2, fid, H5P_DEFAULT, values);
+ * \endcode
+ *
+ * <h4>Combinations of Selections</h4>
+ *
+ * Selections are a very flexible mechanism for reorganizing data during a data transfer. With different
+ * combinations of dataspaces and selections, it is possible to implement many kinds of data transfers
+ * including sub‐setting, sampling, and reorganizing the data. The table below gives some example combinations
+ * of source and destination, and the operations they implement.
+ *
+ * <table>
+ * <caption>Selection operations</caption>
+ * <tr>
+ * <th>
+ * <p>Source</p>
+ * </th>
+ * <th>
+ * <p>Destination</p>
+ * </th>
+ * <th>
+ * <p>Operation</p>
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>All</p>
+ * </td>
+ * <td>
+ * <p>All</p>
+ * </td>
+ * <td>
+ * <p>Copy whole array</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>All</p>
+ * </td>
+ * <td>
+ * <p>All (different shape)</p>
+ * </td>
+ * <td>
+ * <p>Copy and reorganize array</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Hyperslab</p>
+ * </td>
+ * <td>
+ * <p>All</p>
+ * </td>
+ * <td>
+ * <p>Sub-set</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Hyperslab</p>
+ * </td>
+ * <td>
+ * <p>Hyperslab (same shape)</p>
+ * </td>
+ * <td>
+ * <p>Selection</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Hyperslab</p>
+ * </td>
+ * <td>
+ * <p>Hyperslab (different shape)</p>
+ * </td>
+ * <td>
+ * <p>Select and rearrange</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Hyperslab with stride or block</p>
+ * </td>
+ * <td>
+ * <p>All or hyperslab with stride 1</p>
+ * </td>
+ * <td>
+ * <p>Sub-sample, scatter</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Hyperslab</p>
+ * </td>
+ * <td>
+ * <p>Points</p>
+ * </td>
+ * <td>
+ * <p>Scatter</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Points</p>
+ * </td>
+ * <td>
+ * <p>Hyperslab or all</p>
+ * </td>
+ * <td>
+ * <p>Gather</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Points</p>
+ * </td>
+ * <td>
+ * <p>Points (same)</p>
+ * </td>
+ * <td>
+ * <p>Selection</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * <p>Points</p>
+ * </td>
+ * <td>
+ * <p>Points (different)</p>
+ * </td>
+ * <td>
+ * <p>Reorder points</p>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_dataspace_select Dataspace Selection Operations and Data Transfer
+ *
+ * This section is under construction.
+ *
+ * \subsection subsec_dataspace_refer References to Dataset Regions
+ *
+ * Another use of selections is to store a reference to a region of a dataset. An HDF5 object reference
+ * object is a pointer to an object (dataset, group, or committed datatype) in the file. A selection can
+ * be used to create a pointer to a set of selected elements of a dataset, called a region reference. The
+ * selection can be either a point selection or a hyperslab selection.
+ *
+ * A region reference is an object maintained by the HDF5 Library. The region reference can be stored in a
+ * dataset or attribute, and then read. The dataset or attribute is defined to have the special datatype,
+ * #H5T_STD_REF_DSETREG.
+ *
+ * To discover the elements and/or read the data, the region reference can be dereferenced. The
+ * #H5Rdereference call returns an identifier for the dataset, and then the selected dataspace can be
+ * retrieved with a call to #H5Rget_region(). The selected dataspace can be used to read the selected data
+ * elements.
+ *
+ * For more information, \see subsubsec_datatype_other_refs.
+ *
+ * \subsubsection subsubsec_dataspace_refer_use Example Uses for Region References
+ *
+ * Region references are used to implement stored pointers to data within a dataset. For example, features
+ * in a large dataset might be indexed by a table. See the figure below. This table could be stored as an
+ * HDF5 dataset with a compound datatype, for example, with a field for the name of the feature and a region
+ * reference to point to the feature in the dataset. See the second figure below.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_features.gif " Features indexed by a table"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_features_cmpd.gif "Storing the table with a compound datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ *
+ * \subsubsection subsubsec_dataspace_refer_create Creating References to Regions
+ *
+ * To create a region reference:
+ * \li 1. Create or open the dataset that contains the region
+ * \li 2. Get the dataspace for the dataset
+ * \li 3. Define a selection that specifies the region
+ * \li 4. Create a region reference using the dataset and dataspace with selection
+ * \li 5. Write the region reference(s) to the desired dataset or attribute
+ *
+ * The figure below shows a diagram of a file with three datasets. Dataset D1 and D2 are two dimensional
+ * arrays of integers. Dataset R1 is a one dimensional array of references to regions in D1 and D2. The
+ * regions can be any valid selection of the dataspace of the target dataset.
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dspace_three_datasets.gif "A file with three datasets"
+ * </td>
+ * </tr>
+ * </table>
+ * <em>Note: In the figure above, R1 is a 1 D array of region pointers; each pointer refers to a selection
+ * in one dataset.</em>
+ *
+ * The example below shows code to create the array of region references. The references are created in an
+ * array of type #hdset_reg_ref_t. Each region is defined as a selection on the dataspace of the dataset,
+ * and a reference is created using \ref H5Rcreate(). The call to \ref H5Rcreate() specifies the file,
+ * dataset, and the dataspace with selection.
+ *
+ * <em>Create an array of region references</em>
+ * \code
+ * // create an array of 4 region references
+ * hdset_reg_ref_t ref[4];
+ *
+ * // Create a reference to the first hyperslab in the first Dataset.
+ * offset[0] = 1; offset[1] = 1;
+ * count[0] = 3; count[1] = 2;
+ * status = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, offset, NULL, count, NULL);
+ * status = H5Rcreate(&ref[0], file_id, "D1", H5R_DATASET_REGION, space_id);
+ *
+ * // The second reference is to a union of hyperslabs in the first Dataset
+ * offset[0] = 5; offset[1] = 3;
+ * count[0] = 1; count[1] = 4;
+ * status = H5Sselect_none(space_id);
+ * status = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, offset, NULL, count, NULL);
+ * offset[0] = 6; offset[1] = 5;
+ * count[0] = 1; count[1] = 2;
+ * status = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, offset, NULL, count, NULL);
+ * status = H5Rcreate(&ref[1], file_id, "D1", H5R_DATASET_REGION, space_id);
+ *
+ * // the fourth reference is to a selection of points in the first Dataset
+ * status = H5Sselect_none(space_id);
+ * coord[0][0] = 4; coord[0][1] = 4;
+ * coord[1][0] = 2; coord[1][1] = 6;
+ * coord[2][0] = 3; coord[2][1] = 7;
+ * coord[3][0] = 1; coord[3][1] = 5;
+ * coord[4][0] = 5; coord[4][1] = 8;
+ *
+ * status = H5Sselect_elements(space_id, H5S_SELECT_SET, num_points, (const hssize_t **)coord);
+ * status = H5Rcreate(&ref[3], file_id, "D1", H5R_DATASET_REGION, space_id);
+ *
+ * // the third reference is to a hyperslab in the second Dataset
+ * offset[0] = 0; offset[1] = 0;
+ * count[0] = 4; count[1] = 6;
+ * status = H5Sselect_hyperslab(space_id2, H5S_SELECT_SET, offset, NULL, count, NULL);
+ * status = H5Rcreate(&ref[2], file_id, "D2", H5R_DATASET_REGION, space_id2);
+ * \endcode
+ *
+ * When all the references are created, the array of references is written to the dataset R1. The
+ * dataset is declared to have datatype #H5T_STD_REF_DSETREG. See the example below.
+ *
+ * <em>Write the array of references to a dataset</em>
+ * \code
+ * Hsize_t dimsr[1];
+ * dimsr[0] = 4;
+ *
+ * // Dataset with references.
+ * spacer_id = H5Screate_simple(1, dimsr, NULL);
+ * dsetr_id = H5Dcreate(file_id, "R1", H5T_STD_REF_DSETREG, spacer_id, H5P_DEFAULT, H5P_DEFAULT,
+ * H5P_DEFAULT);
+ *
+ * // Write dataset with the references.
+ * status = H5Dwrite(dsetr_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref);
+ *
+ * \endcode
+ *
+ * When creating region references, the following rules are enforced.
+ * \li The selection must be a valid selection for the target dataset, just as when transferring data
+ * \li The dataset must exist in the file when the reference is created; #H5Rcreate
+ * \li The target dataset must be in the same file as the stored reference
+ *
+ * \subsubsection subsubsec_dataspace_refer_read Reading References to Regions
+ *
+ * To retrieve data from a region reference, the reference must be read from the file, and then the data can
+ * be retrieved. The steps are:
+ * \li 1. Open the dataset or attribute containing the reference objects
+ * \li 2. Read the reference object(s)
+ * \li 3. For each region reference, get the dataset (#H5Rdereference) and dataspace (#H5Rget_region)
+ * \li 4. Use the dataspace and datatype to discover what space is needed to store the data, allocate the
+ * correct storage and create a dataspace and datatype to define the memory data layout
+ *
+ * The example below shows code to read an array of region references from a dataset, and then read the
+ * data from the first selected region. Note that the region reference has information that records the
+ * dataset (within the file) and the selection on the dataspace of the dataset. After dereferencing the
+ * regions reference, the datatype, number of points, and some aspects of the selection can be discovered.
+ * (For a union of hyperslabs, it may not be possible to determine the exact set of hyperslabs that has been
+ * combined.)
+ * The table below the code example shows the inquiry functions.
+ *
+ * When reading data from a region reference, the following rules are enforced:
+ * \li The target dataset must be present and accessible in the file
+ * \li The selection must be a valid selection for the dataset
+ *
+ * <em>Read an array of region references; read from the first selection</em>
+ * \code
+ * dsetr_id = H5Dopen (file_id, "R1", H5P_DEFAULT);
+ * status = H5Dread(dsetr_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref_out);
+ *
+ * // Dereference the first reference.
+ * // 1) get the dataset (H5Rdereference)
+ * // 2) get the selected dataspace (H5Rget_region)
+ *
+ * dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, &ref_out[0]);
+ * space_id = H5Rget_region(dsetr_id, H5R_DATASET_REGION, &ref_out[0]);
+ *
+ * // Discover how many points and shape of the data
+ * ndims = H5Sget_simple_extent_ndims(space_id);
+ * H5Sget_simple_extent_dims(space_id,dimsx,NULL);
+ *
+ * // Read and display hyperslab selection from the dataset.
+ * dimsy[0] = H5Sget_select_npoints(space_id);
+ * spacex_id = H5Screate_simple(1, dimsy, NULL);
+ *
+ * status = H5Dread(dsetv_id, H5T_NATIVE_INT, H5S_ALL, space_id, H5P_DEFAULT, data_out);
+ * printf("Selected hyperslab: ");
+ * for (i = 0; i < 8; i++) {
+ * printf("\n");
+ * for (j = 0; j < 10; j++)
+ * printf("%d ", data_out[i][j]);
+ * }
+ * printf("\n");
+ * \endcode
+ *
+ * <table>
+ * <caption>The inquiry functions</caption>
+ * <tr>
+ * <th>
+ * <p>Function</p>
+ * </th>
+ * <th>
+ * <p>Information</p>
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * @ref H5Sget_select_npoints
+ * </td>
+ * <td>
+ * <p>The number of elements in the selection (hyperslab or point selection).</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * @ref H5Sget_select_bounds
+ * </td>
+ * <td>
+ * <p>The bounding box that encloses the selected points (hyperslab or point selection).</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * @ref H5Sget_select_hyper_nblocks
+ * </td>
+ * <td>
+ * <p>The number of blocks in the selection.</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * @ref H5Sget_select_hyper_blocklist
+ * </td>
+ * <td>
+ * <p>A list of the blocks in the selection.</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * @ref H5Sget_select_elem_npoints
+ * </td>
+ * <td>
+ * <p>The number of points in the selection.</p>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * @ref H5Sget_select_elem_pointlist
+ * </td>
+ * <td>
+ * <p>The points.</p>
+ * </td>
+ * </tr>
+ * </table>
+ *
+ *
+ * \subsection subsec_dataspace_sample Sample Programs
+ *
+ * This section contains the full programs from which several of the code examples in this chapter were
+ * derived. The h5dump output from the program’s output file immediately follows each program.
+ *
+ * <em>h5_write.c</em>
+ * \code
+ * #include "hdf5.h"
+ *
+ * #define H5FILE_NAME "SDS.h5"
+ * #define DATASETNAME "C Matrix"
+ * #define NX 3
+ * #define NY 5
+ * #define RANK 2 // dataset dimensions
+ *
+ * int
+ * main (void)
+ * {
+ * hid_t file, dataset; // file and dataset identifiers
+ * hid_t datatype, dataspace; // identifiers
+ * hsize_t dims[2]; // dataset dimensions
+ * herr_t status;
+ * int data[NX][NY]; // data to write
+ * int i, j;
+ *
+ * //
+ * // Data and output buffer initialization.
+ * for (j = 0; j < NX; j++) {
+ * for (i = 0; i < NY; i++)
+ * data[j][i] = i + 1 + j*NY;
+ * }
+ * // 1 2 3 4 5
+ * // 6 7 8 9 10
+ * // 11 12 13 14 15
+ *
+ * // Create a new file using H5F_ACC_TRUNC access,
+ * // default file creation properties, and default file
+ * // access properties.
+ * file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * // Describe the size of the array and create the data space for fixed
+ * // size dataset.
+ * dims[0] = NX;
+ * dims[1] = NY;
+ * dataspace = H5Screate_simple(RANK, dims, NULL);
+ *
+ * // Create a new dataset within the file using defined dataspace and
+ * // datatype and default dataset creation properties.
+ * dataset = H5Dcreate(file, DATASETNAME, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
+ * H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * // Write the data to the dataset using default transfer properties.
+ * status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+ *
+ * // Close/release resources.
+ * H5Sclose(dataspace);
+ * H5Dclose(dataset);
+ * H5Fclose(file);
+ *
+ * return 0;
+ * }
+ *
+ * SDS.out
+ * -------
+ * HDF5 "SDS.h5" {
+ * GROUP "/" {
+ * DATASET "C Matrix" {
+ * DATATYPE H5T_STD_I32BE
+ * DATASPACE SIMPLE { ( 3, 5 ) / ( 3, 5 ) }
+ * DATA {
+ * 1, 2, 3, 4, 5,
+ * 6, 7, 8, 9, 10,
+ * 11, 12, 13, 14, 15
+ * }
+ * }
+ *
+ * \endcode
+ *
+ * <em>h5_write.f90</em>
+ * \code
+ * ----------
+ * PROGRAM DSETEXAMPLE
+ *
+ * USE HDF5 ! This module contains all necessary modules
+ *
+ * IMPLICIT NONE
+ *
+ * CHARACTER(LEN=7), PARAMETER :: filename = "SDSf.h5" ! File name
+ * CHARACTER(LEN=14), PARAMETER :: dsetname = "Fortran Matrix" ! Dataset name
+ * INTEGER, PARAMETER :: NX = 3
+ * INTEGER, PARAMETER :: NY = 5
+ *
+ * INTEGER(HID_T) :: file_id ! File identifier
+ * INTEGER(HID_T) :: dset_id ! Dataset identifier
+ * INTEGER(HID_T) :: dspace_id ! Dataspace identifier
+ *
+ * INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/3,5/) ! Dataset dimensions
+ * INTEGER :: rank = 2 ! Dataset rank
+ * INTEGER :: data(NX,NY)
+ * INTEGER :: error ! Error flag
+ * INTEGER :: i, j
+ *
+ * !
+ * ! Initialize data
+ * !
+ * do i = 1, NX
+ * do j = 1, NY
+ * data(i,j) = j + (i-1)*NY
+ * enddo
+ * enddo
+ * !
+ * ! Data
+ * !
+ * ! 1 2 3 4 5
+ * ! 6 7 8 9 10
+ * ! 11 12 13 14 15
+ *
+ * !
+ * ! Initialize FORTRAN interface.
+ * !
+ * CALLh5open_f(error)
+ *
+ * !
+ * ! Create a new file using default properties.
+ * !
+ * CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
+ *
+ * !
+ * ! Create the dataspace.
+ * !
+ * CALL h5screate_simple_f(rank, dims, dspace_id, error)
+ *
+ * !
+ * ! Create and write dataset using default properties.
+ * !
+ * CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
+ * dset_id, error, H5P_DEFAULT_F, H5P_DEFAULT_F, &
+ * H5P_DEFAULT_F)
+ *
+ * CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, dims, error)
+ *
+ * !
+ * ! End access to the dataset and release resources used by it.
+ * !
+ * CALL h5dclose_f(dset_id, error)
+ *
+ * !
+ * ! Terminate access to the data space.
+ * !
+ * CALL h5sclose_f(dspace_id, error)
+ *
+ * !
+ * ! Close the file.
+ * !
+ * CALL h5fclose_f(file_id, error)
+ *
+ * !
+ * ! Close FORTRAN interface.
+ * !
+ * CALL h5close_f(error)
+ *
+ * END PROGRAM DSETEXAMPLE
+ *
+ * SDSf.out
+ * --------
+ * HDF5 "SDSf.h5" {
+ * GROUP "/" {
+ * DATASET "Fortran Matrix" {
+ * DATATYPE H5T_STD_I32BE
+ * DATASPACE SIMPLE { ( 5, 3 ) / ( 5, 3 ) }
+ * DATA {
+ * 1, 6, 11,
+ * 2, 7, 12,
+ * 3, 8, 13,
+ * 4, 9, 14,
+ * 5, 10, 15
+ * }
+ * }
+ * }
+ * }
+ *
+ * \endcode
+ *
+ * <em>h5_write_tr.f90</em>
+ * \code
+ * PROGRAM DSETEXAMPLE
+ *
+ * USE HDF5 ! This module contains all necessary modules
+ *
+ * IMPLICIT NONE
+ *
+ * CHARACTER(LEN=10), PARAMETER :: filename = "SDSf_tr.h5" ! File name
+ * CHARACTER(LEN=24), PARAMETER :: dsetname = "Fortran Transpose Matrix"! Dataset name
+ *
+ * INTEGER, PARAMETER :: NX = 3
+ * INTEGER, PARAMETER :: NY = 5
+ *
+ * INTEGER(HID_T) :: file_id ! File identifier
+ * INTEGER(HID_T) :: dset_id ! Dataset identifier
+ * INTEGER(HID_T) :: dspace_id ! Dataspace identifier
+ *
+ * INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/NY, NX/) ! Dataset dimensions
+ * INTEGER :: rank = 2 ! Dataset rank
+ * INTEGER :: data(NY,NX)
+ *
+ * INTEGER :: error ! Error flag
+ * INTEGER :: i, j
+ *
+ * !
+ * ! Initialize data
+ * !
+ * do i = 1, NY
+ * do j = 1, NX
+ * data(i,j) = i + (j-1)*NY
+ * enddo
+ * enddo
+ *
+ * !
+ * ! Data
+ * !
+ * ! 1 6 11
+ * ! 2 7 12
+ * ! 3 8 13
+ * ! 4 9 14
+ * ! 5 10 15
+ *
+ * !
+ * ! Initialize FORTRAN interface.
+ * !
+ * CALL h5open_f(error)
+ *
+ * !
+ * ! Create a new file using default properties.
+ * !
+ * CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
+ *
+ * !
+ * ! Create the dataspace.
+ * !
+ * CALL h5screate_simple_f(rank, dims, dspace_id, error)
+ *
+ * !
+ * ! Create and write dataset using default properties.
+ * !
+ * CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
+ * dset_id, error, H5P_DEFAULT_F, H5P_DEFAULT_F, &
+ * H5P_DEFAULT_F)
+ * CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, dims, error)
+ *
+ * !
+ * ! End access to the dataset and release resources used by it.
+ * !
+ * CALL h5dclose_f(dset_id, error)
+ *
+ * !
+ * ! Terminate access to the data space.
+ * !
+ * CALL h5sclose_f(dspace_id, error)
+ *
+ * !
+ * ! Close the file.
+ * !
+ * CALL h5fclose_f(file_id, error)
+ *
+ * !
+ * ! Close FORTRAN interface.
+ * !
+ * CALL h5close_f(error)
+ *
+ * END PROGRAM DSETEXAMPLE
+ *
+ * SDSf_tr.out
+ * -----------
+ * HDF5 "SDSf_tr.h5" {
+ * GROUP "/" {
+ * DATASET "Fortran Transpose Matrix" {
+ * DATATYPE H5T_STD_I32LE
+ * DATASPACE SIMPLE { ( 3, 5 ) / ( 3, 5 ) }
+ * DATA {
+ * 1, 2, 3, 4, 5,
+ * 6, 7, 8, 9, 10,
+ * 11, 12, 13, 14, 15
+ * }
+ * }
+ * }
+ * }
+ *
+ * \endcode
+ *
+ * Previous Chapter \ref sec_datatype - Next Chapter \ref sec_attribute
+ *
+ */
+
+/**
+ * \defgroup H5S Dataspaces (H5S)
*
* Use the functions in this module to manage HDF5 dataspaces \Emph{and} selections.
*
@@ -40,6 +1527,7 @@
* using \Emph{selections}. Furthermore, certain set operations are supported
* for selections.
*
+ * <!--
* <table>
* <tr><th>Create</th><th>Read</th></tr>
* <tr valign="top">
@@ -59,7 +1547,7 @@
* </td>
* </tr>
* </table>
- *
+ * -->
*/
#endif /* H5Smodule_H */
diff --git a/src/H5Tmodule.h b/src/H5Tmodule.h
index 8f7d04d..f631007 100644
--- a/src/H5Tmodule.h
+++ b/src/H5Tmodule.h
@@ -28,7 +28,3837 @@
#define H5_MY_PKG H5T
#define H5_MY_PKG_ERR H5E_DATATYPE
-/**\defgroup H5T H5T
+/** \page H5T_UG HDF5 Datatypes
+ *
+ * \section sec_datatype HDF5 Datatypes
+ * HDF5 datatypes describe the element type of HDF5 datasets and attributes.
+ * There's a large set of predefined datatypes, but users may find it useful
+ * to define new datatypes through a process called \Emph{derivation}.
+ *
+ * The element type is automatically persisted as part of the HDF5 metadata of
+ * attributes and datasets. Additionally, datatype definitions can be persisted
+ * to HDF5 files and linked to groups as HDF5 datatype objects or so-called
+ * \Emph{committed datatypes}.
+ *
+ * \subsection subsec_datatype_intro Introduction and Definitions
+ *
+ * An HDF5 dataset is an array of data elements, arranged according to the specifications
+ * of the dataspace. In general, a data element is the smallest addressable unit of storage
+ * in the HDF5 file. (Compound datatypes are the exception to this rule.) The HDF5 datatype
+ * defines the storage format for a single data element. See the figure below.
+ *
+ * The model for HDF5 attributes is extremely similar to datasets: an attribute has a dataspace
+ * and a data type, as shown in the figure below. The information in this chapter applies to both
+ * datasets and attributes.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig1.gif "Datatypes, dataspaces, and datasets"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Abstractly, each data element within the dataset is a sequence of bits, interpreted as a single
+ * value from a set of values (for example, a number or a character). For a given datatype, there is a
+ * standard or convention for representing the values as bits, and when the bits are represented in a
+ * particular storage the bits are laid out in a specific storage scheme such as 8-bit bytes with a
+ * specific ordering and alignment of bytes within the storage array.
+ *
+ * HDF5 datatypes implement a flexible, extensible, and portable mechanism for specifying and
+ * discovering the storage layout of the data elements, determining how to interpret the elements
+ * (for example, as floating point numbers), and for transferring data from different compatible
+ * layouts.
+ *
+ * An HDF5 datatype describes one specific layout of bits. A dataset has a single datatype which
+ * applies to every data element. When a dataset is created, the storage datatype is defined. After
+ * the dataset or attribute is created, the datatype cannot be changed.
+ * \li The datatype describes the storage layout of a singledata element
+ * \li All elements of the dataset must have the same type
+ * \li The datatype of a dataset is immutable
+ *
+ * When data is transferred (for example, a read or write), each end point of the transfer has a
+ * datatype, which describes the correct storage for the elements. The source and destination may
+ * have different (but compatible) layouts, in which case the data elements are automatically
+ * transformed during the transfer.
+ *
+ * HDF5 datatypes describe commonly used binary formats for numbers (integers
+ * and floating point) and characters (ASCII). A given computing architecture and programming language
+ * supports certain number and character representations. For example, a computer may support 8-,
+ * 16-, 32-, and 64-bit signed integers, stored in memory in little-endian byte order. These would
+ * presumably correspond to the C programming language types \Emph{char}, \Emph{short},
+ * \Emph{int}, and \Emph{long}.
+ *
+ * When reading and writing from memory, the HDF5 library must know the appropriate datatype
+ * that describes the architecture specific layout. The HDF5 library provides the platform
+ * independent \Emph{NATIVE} types, which are mapped to an appropriate datatype for each platform.
+ * So the type #H5T_NATIVE_INT is an alias for the appropriate descriptor for each platform.
+ *
+ * Data in memory has a datatype:
+ * \li The storage layout in memory is architecture-specific
+ * \li The HDF5 \Emph{NATIVE} types are predefined aliases for the architecture-specific memory layout
+ * \li The memory datatype need not be the same as the stored datatype of the dataset
+ *
+ * In addition to numbers and characters, an HDF5 datatype can describe more abstract classes of
+ * types including enumerations, strings, bit strings, and references (pointers to objects in the HDF5
+ * file). HDF5 supports several classes of composite datatypes which are combinations of one or
+ * more other datatypes. In addition to the standard predefined datatypes, users can define new
+ * datatypes within the datatype classes.
+ *
+ * The HDF5 datatype model is very general and flexible:
+ * \li For common simple purposes, only predefined types will be needed
+ * \li Datatypes can be combined to create complex structured datatypes
+ * \li If needed, users can define custom atomic datatypes
+ * \li Committed datatypes can be shared by datasets or attributes
+ *
+ * \subsection subsec_datatype_model Datatype Model
+ * The HDF5 library implements an object-oriented model of datatypes. HDF5 datatypes are
+ * organized as a logical set of base types, or datatype classes. Each datatype class defines
+ * a format for representing logical values as a sequence of bits. For example the #H5T_INTEGER
+ * class is a format for representing twos complement integers of various sizes.
+ *
+ * A datatype class is defined as a set of one or more datatype properties. A datatype property is
+ * a property of the bit string. The datatype properties are defined by the logical model of the
+ * datatype class. For example, the integer class (twos complement integers) has properties such as
+ * “signed or unsigned”, “length”, and “byte-order”. The float class (IEEE floating point numbers)
+ * has these properties, plus “exponent bits”, “exponent sign”, etc.
+ *
+ * A datatype is derived from one datatype class: a given datatype has a specific value for the
+ * datatype properties defined by the class. For example, for 32-bit signed integers, stored
+ * big-endian, the HDF5 datatype is a sub-type of integer with the properties set to
+ * signed=1, size=4(bytes), and byte-order=BE.
+ *
+ * The HDF5 datatype API (H5T functions) provides methods to create datatypes of different
+ * datatype classes, to set the datatype properties of a new datatype, and to discover the datatype
+ * properties of an existing datatype.
+ *
+ * The datatype for a dataset is stored in the HDF5 file as part of the metadata for the dataset.
+ * A datatype can be shared by more than one dataset in the file if the datatype is saved to the
+ * file with a name. This shareable datatype is known as a committed datatype. In the past,
+ * this kind of datatype was called a named datatype.
+ *
+ * When transferring data (for example, a read or write), the data elements of the source and
+ * destination storage must have compatible types. As a general rule, data elements with the same
+ * datatype class are compatible while elements from different datatype classes are not compatible.
+ * When transferring data of one datatype to another compatible datatype, the HDF5 Library uses
+ * the datatype properties of the source and destination to automatically transform each data
+ * element. For example, when reading from data stored as 32-bit signed integers, big
+ * endian into 32-bit signed integers, little-endian, the HDF5 Library will automatically swap the
+ * bytes.
+ *
+ * Thus, data transfer operations (\ref H5Dread, \ref H5Dwrite, \ref H5Aread, \ref H5Awrite) require
+ * a datatype for both the source and the destination.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig2.gif "The datatype model"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The HDF5 library defines a set of predefined datatypes, corresponding to commonly used
+ * storage formats, such as twos complement integers, IEEE Floating point numbers, etc., 4-
+ * and 8-byte sizes, big-endian and little-endian byte orders. In addition, a user can derive types with
+ * custom values for the properties. For example, a user program may create a datatype to describe
+ * a 6-bit integer, or a 600-bit floating point number.
+ *
+ * In addition to atomic datatypes, the HDF5 library supports composite datatypes. A composite
+ * datatype is an aggregation of one or more datatypes. Each class of composite datatypes has
+ * properties that describe the organization of the composite datatype. See the figure below.
+ * Composite datatypes include:
+ * \li Compound datatypes: structured records
+ * \li Array: a multidimensional array of a datatype
+ * \li Variable-length: a one-dimensional array of a datatype
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig3.gif "Composite datatypes"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_datatype_model_class Datatype Classes and Properties
+ * The figure below shows the HDF5 datatype classes. Each class is defined to have a set of
+ * properties which describe the layout of the data element and the interpretation of the bits. The
+ * table below lists the properties for the datatype classes.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig4.gif "Datatype classes"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Datatype classes and their properties</caption>
+ * <tr>
+ * <th>
+ * Class
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * <th>
+ * Properties
+ * </th>
+ * <th>
+ * Notes
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * Integer
+ * </td>
+ * <td>
+ * Twos complement integers
+ * </td>
+ * <td>
+ * Size (bytes), precision (bits), offset (bits), pad, byte order, signed/unsigned
+ * </td>
+ * <td>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Float
+ * </td>
+ * <td>
+ * Floating Point numbers
+ * </td>
+ * <td>
+ * Size (bytes), precision (bits), offset (bits), pad, byte order, sign position,
+ * exponent position, exponent size (bits), exponent sign, exponent bias, mantissa position,
+ * mantissa (size) bits, mantissa sign, mantissa normalization, internal padding
+ * </td>
+ * <td>
+ * See IEEE 754 for a definition of these properties. These properties describe
+ * non-IEEE 754 floating point formats as well.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Character
+ * </td>
+ * <td>
+ * Array of 1-byte character encoding
+ * </td>
+ * <td>
+ * Size (characters), Character set, byte order, pad/no pad, pad character
+ * </td>
+ * <td>
+ * Currently, ASCII and UTF-8 are supported.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Bitfield
+ * </td>
+ * <td>
+ * String of bits
+ * </td>
+ * <td>
+ * Size (bytes), precision (bits), offset (bits), pad, byte order
+ * </td>
+ * <td>
+ * A sequence of bit values packed into one or more bytes.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Opaque
+ * </td>
+ * <td>
+ * Uninterpreted data
+ * </td>
+ * <td>
+ * Size (bytes), precision (bits), offset (bits), pad, byte order, tag
+ * </td>
+ * <td>
+ * A sequence of bytes, stored and retrieved as a block.
+ * The ‘tag’ is a string that can be used to label the value.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Enumeration
+ * </td>
+ * <td>
+ * A list of discrete values, with symbolic names in the form of strings.
+ * </td>
+ * <td>
+ * Number of elements, element names, element values
+ * </td>
+ * <td>
+ * Enumeration is a list of pairs (name, value). The name is a string; the
+ * value is an unsigned integer.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Reference
+ * </td>
+ * <td>
+ * Reference to object or region within the HDF5 file
+ * </td>
+ * <td>
+ *
+ * </td>
+ * <td>
+ * @see H5R
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Array
+ * </td>
+ * <td>
+ * Array (1-4 dimensions) of data elements
+ * </td>
+ * <td>
+ * Number of dimensions, dimension sizes, base datatype
+ * </td>
+ * <td>
+ * The array is accessed atomically: no selection or sub-setting.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Variable-length
+ * </td>
+ * <td>
+ * A variable-length 1-dimensional array of data elements
+ * </td>
+ * <td>
+ * Current size, base type
+ * </td>
+ * <td>
+ *
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Compound
+ * </td>
+ * <td>
+ * A Datatype of a sequence of Datatypes
+ * </td>
+ * <td>
+ * Number of members, member names, member types, member offset, member class,
+ * member size, byte order
+ * </td>
+ * <td>
+ *
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_datatype_model_predefine Predefined Datatypes
+ * The HDF5 library predefines a modest number of commonly used datatypes. These types have
+ * standard symbolic names of the form H5T_arch_base where arch is an architecture name and
+ * base is a programming type name <b>Table 2</b>. New types can be derived from the predefined
+ * types by copying the predefined type \ref H5Tcopy() and then modifying the result.
+ *
+ * The base name of most types consists of a letter to indicate the class <b>Table 3</b>, a precision in
+ * bits, and an indication of the byte order <b>Table 4</b>.
+ *
+ * <b>Table 5</b> shows examples of predefined datatypes. The full list can be found in the
+ * \ref PDT section of the \ref RM.
+ *
+ * <table>
+ * <caption align=top>Table 2. Architectures used in predefined datatypes</caption>
+ * <tr>
+ * <th>
+ * Architecture Name
+ * </th>
+ * <th span='3'>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * IEEE
+ * </td>
+ * <td span='3'>
+ * IEEE-754 standard floating point types in various byte orders.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * STD
+ * </td>
+ * <td span='3'>
+ * This is an architecture that contains semi-standard datatypes like signed
+ * two’s complement integers, unsigned integers, and bitfields in various
+ * byte orders.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * C <br \> FORTRAN
+ * </td>
+ * <td span='3'>
+ * Types which are specific to the C or Fortran programming languages
+ * are defined in these architectures. For instance, #H5T_C_S1 defines a
+ * base string type with null termination which can be used to derive string
+ * types of other lengths.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * NATIVE
+ * </td>
+ * <td span='3'>
+ * This architecture contains C-like datatypes for the machine on which
+ * the library was compiled. The types were actually defined by running
+ * the H5detect program when the library was compiled. In order to be
+ * portable, applications should almost always use this architecture
+ * to describe things in memory.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * CRAY
+ * </td>
+ * <td span='3'>
+ * Cray architectures. These are word-addressable, big-endian systems
+ * with non-IEEE floating point.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * INTEL
+ * </td>
+ * <td span='3'>
+ * All Intel and compatible CPU’s.
+ * These are little-endian systems with IEEE floating-point.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * MIPS
+ * </td>
+ * <td span='3'>
+ * All MIPS CPU’s commonly used in SGI systems. These are big-endian
+ * systems with IEEE floating-point.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * ALPHA
+ * </td>
+ * <td span='3'>
+ * All DEC Alpha CPU’s, little-endian systems with IEEE floating-point.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 3. Base types</caption>
+ * <tr>
+ * <th>
+ * Base
+ * </th>
+ * <th span='3'>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * B
+ * </td>
+ * <td span='3'>
+ * Bitfield
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * F
+ * </td>
+ * <td span='3'>
+ * Floating point
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * I
+ * </td>
+ * <td span='3'>
+ * Signed integer
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * R
+ * </td>
+ * <td span='3'>
+ * References
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * S
+ * </td>
+ * <td span='3'>
+ * Character string
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * U
+ * </td>
+ * <td span='3'>
+ * Unsigned integer
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 4. Byte order</caption>
+ * <tr>
+ * <th>
+ * Order
+ * </th>
+ * <th span='3'>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * BE
+ * </td>
+ * <td span='3'>
+ * Big-endian
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * LE
+ * </td>
+ * <td span='3'>
+ * Little-endian
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 5. Some predefined datatypes</caption>
+ * <tr>
+ * <th>
+ * Example
+ * </th>
+ * <th span='3'>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_IEEE_F64LE
+ * </td>
+ * <td span='3'>
+ * Eight-byte, little-endian, IEEE floating-point
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_IEEE_F32BE
+ * </td>
+ * <td span='3'>
+ * Four-byte, big-endian, IEEE floating point
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_STD_I32LE
+ * </td>
+ * <td span='3'>
+ * Four-byte, little-endian, signed two’s complement integer
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_STD_U16BE
+ * </td>
+ * <td span='3'>
+ * Two-byte, big-endian, unsigned integer
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_C_S1
+ * </td>
+ * <td span='3'>
+ * One-byte,null-terminated string of eight-bit characters
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_INTEL_B64
+ * </td>
+ * <td span='3'>
+ * Eight-byte bit field on an Intel CPU
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_STD_REF_OBJ
+ * </td>
+ * <td span='3'>
+ * Reference to an entire object in a file
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The HDF5 library predefines a set of \Emph{NATIVE} datatypes which are similar to C type names.
+ * The native types are set to be an alias for the appropriate HDF5 datatype for each platform. For
+ * example, #H5T_NATIVE_INT corresponds to a C int type. On an Intel based PC, this type is the same as
+ * #H5T_STD_I32LE, while on a MIPS system this would be equivalent to #H5T_STD_I32BE. Table 6 shows
+ * examples of \Emph{NATIVE} types and corresponding C types for a common 32-bit workstation.
+ *
+ * <table>
+ * <caption align=top>Table 6. Native and 32-bit C datatypes</caption>
+ * <tr>
+ * <th>
+ * Example
+ * </th>
+ * <th span='3'>
+ * Corresponding C Type
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_CHAR
+ * </td>
+ * <td span='3'>
+ * char
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_SCHAR
+ * </td>
+ * <td span='3'>
+ * signed char
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_UCHAR
+ * </td>
+ * <td span='3'>
+ * unsigned char
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_SHORT
+ * </td>
+ * <td span='3'>
+ * short
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_USHORT
+ * </td>
+ * <td span='3'>
+ * unsigned short
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_INT
+ * </td>
+ * <td span='3'>
+ * int
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_UINT
+ * </td>
+ * <td span='3'>
+ * unsigned
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_LONG
+ * </td>
+ * <td span='3'>
+ * long
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_ULONG
+ * </td>
+ * <td span='3'>
+ * unsigned long
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_LLONG
+ * </td>
+ * <td span='3'>
+ * long long
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_ULLONG
+ * </td>
+ * <td span='3'>
+ * unsigned long long
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_FLOAT
+ * </td>
+ * <td span='3'>
+ * float
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_DOUBLE
+ * </td>
+ * <td span='3'>
+ * double
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_LDOUBLE
+ * </td>
+ * <td span='3'>
+ * long double
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_HSIZE
+ * </td>
+ * <td span='3'>
+ * hsize_t
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_HSSIZE
+ * </td>
+ * <td span='3'>
+ * hssize_t
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_HERR
+ * </td>
+ * <td span='3'>
+ * herr_t
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_HBOOL
+ * </td>
+ * <td span='3'>
+ * hbool_t
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_B8
+ * </td>
+ * <td span='3'>
+ * 8-bit unsigned integer or 8-bit buffer in memory
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_B16
+ * </td>
+ * <td span='3'>
+ * 16-bit unsigned integer or 16-bit buffer in memory
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_B32
+ * </td>
+ * <td span='3'>
+ * 32-bit unsigned integer or 32-bit buffer in memory
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * #H5T_NATIVE_B64
+ * </td>
+ * <td span='3'>
+ * 64-bit unsigned integer or 64-bit buffer in memory
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_datatype_usage How Datatypes are Used
+ *
+ * \subsubsection subsubsec_datatype_usage_object The Datatype Object and the HDF5 Datatype API
+ * The HDF5 library manages datatypes as objects. The HDF5 datatype API manipulates the
+ * datatype objects through C function calls. New datatypes can be created from scratch or
+ * copied from existing datatypes. When a datatype is no longer needed its resources should be released by
+ * calling \ref H5Tclose().
+ *
+ * The datatype object is used in several roles in the HDF5 data model and library. Essentially, a
+ * datatype is used whenever the form at of data elements is needed. There are four major uses of
+ * datatypes in the HDF5 library: at dataset creation, during data transfers, when discovering the
+ * contents of a file, and for specifying user-defined datatypes. See the table below.
+ *
+ * <table>
+ * <caption align=top>Table 7. Datatype uses</caption>
+ * <tr>
+ * <th>
+ * Use
+ * </th>
+ * <th span='2'>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * Dataset creation
+ * </td>
+ * <td span='2'>
+ * The datatype of the data elements must be declared when the dataset is created.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Dataset transfer
+ * </td>
+ * <td span='2'>
+ * The datatype (format) of the data elements must be defined for both the source and destination.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Discovery
+ * </td>
+ * <td span='2'>
+ * The datatype of a dataset can be interrogated to retrieve a complete description of the storage layout.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Creating user-defined datatypes
+ * </td>
+ * <td span='2'>
+ * Users can define their own datatypes by creating datatype objects and setting their properties.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_datatype_usage_create Dataset Creation
+ * All the data elements of a dataset have the same datatype. When a dataset is created, the datatype
+ * for the data elements must be specified. The datatype of a dataset can never be changed. The
+ * example below shows the use of a datatype to create a dataset called “/dset”. In this example, the
+ * dataset will be stored as 32-bit signed integers in big-endian order.
+ *
+ * <em> Using a datatype to create a dataset </em>
+ * \code
+ * hid_t dt;
+ *
+ * dt = H5Tcopy(H5T_STD_I32BE);
+ * dataset_id = H5Dcreate(file_id, “/dset”, dt, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * \subsubsection subsubsec_datatype_usage_transfer Data Transfer (Read and Write)
+ * Probably the most common use of datatypes is to write or read data from a dataset or attribute. In
+ * these operations, each data element is transferred from the source to the destination (possibly
+ * rearranging the order of the elements). Since the source and destination do not need to be
+ * identical (in other words, one is disk and the other is memory), the transfer requires
+ * both the format of the source element and the destination element. Therefore, data transfers use two
+ * datatype objects, for the source and destination.
+ *
+ * When data is written, the source is memory and the destination is disk (file). The memory
+ * datatype describes the format of the data element in the machine memory, and the file datatype
+ * describes the desired format of the data element on disk. Similarly, when reading, the source
+ * datatype describes the format of the data element on disk, and the destination datatype describes
+ * the format in memory.
+ *
+ * In the most common cases, the file datatype is the datatype specified when
+ * the dataset was
+ * created, and the memory datatype should be the appropriate \Emph{NATIVE} type.
+ * The examples below show samples of writing data to and reading data from a dataset. The data
+ * in memory is declared C type ‘int’, and the datatype #H5T_NATIVE_INT corresponds to this
+ * type. The datatype of the dataset should be of datatype class #H5T_INTEGER.
+ *
+ * <em> Writing to a dataset </em>
+ * \code
+ * int dset_data[DATA_SIZE];
+ *
+ * status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+ * \endcode
+ *
+ * <em> Reading from a dataset </em>
+ * \code
+ * int dset_data[DATA_SIZE];
+ *
+ * status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, dset_data);
+ * \endcode
+ *
+ * \subsubsection subsubsec_datatype_usage_discover Discovery of Data Format
+ * The HDF5 Library enables a program to
+ * determine the datatype class and properties for any
+ * datatype. In order to discover the storage format of data in a dataset, the datatype is obtained, and
+ * the properties are determined by queries to the datatype object. The example below shows code
+ * that analyzes the datatype for an integer and prints out a description of its storage properties
+ * (byte order, signed, size).
+ *
+ * <em> Discovering datatype properties </em>
+ * \code
+ * switch (H5Tget_class(type)) {
+ * case H5T_INTEGER:
+ * ord = H5Tget_order(type);
+ * sgn = H5Tget_sign(type);
+ * printf(“Integer ByteOrder= ”);
+ * switch (ord) {
+ * case H5T_ORDER_LE:
+ * printf(“LE”);
+ * break;
+ * case H5T_ORDER_BE:
+ * printf(“BE”);
+ * break;
+ * }
+ * printf(“ Sign= ”);
+ * switch (sgn) {
+ * case H5T_SGN_NONE:
+ * printf(“false”);
+ * break;
+ * case H5T_SGN_2:
+ * printf(“true”);
+ * break;
+ * }
+ * printf(“ Size= ”);
+ * sz = H5Tget_size(type);
+ * printf(“%d”, sz);
+ * printf(“\n”);
+ * break;
+ * case H5T_????
+ * ...
+ * break;
+ * }
+ * \endcode
+ *
+ * \subsubsection subsubsec_datatype_usage_user Creating and Using User‐defined Datatypes
+ * Most programs will primarily use the predefined datatypes described above, possibly in
+ * composite data types such as compound or array datatypes. However, the HDF5 datatype model
+ * is extremely general; a user program can define a great variety of atomic datatypes (storage
+ * layouts). In particular, the datatype properties can define signed and unsigned integers of any
+ * size and byte order, and floating point numbers with different formats, size, and byte order. The
+ * HDF5 datatype API provides methods to set these properties.
+ *
+ * User-defined types can be used to define the layout of data in memory; examples might match
+ * some platform specific number format or application defined bit-field. The user-defined type can
+ * also describe data in the file such as an application-defined format. The user-defined types can be
+ * translated to and from standard types of the same class, as described above.
+ *
+ * \subsection subsec_datatype_function Datatype Function Summaries
+ * @see H5T reference manual provides a reference list of datatype functions, the H5T APIs.
+ *
+ * \subsection subsec_datatype_program Programming Model for Datatypes
+ * The HDF5 Library implements an object-oriented model of datatypes. HDF5 datatypes are
+ * organized as a logical set of base types, or datatype classes. The HDF5 Library manages
+ * datatypes as objects. The HDF5 datatype API manipulates the datatype objects through C
+ * function calls. The figure below shows the abstract view of the datatype object. The table below
+ * shows the methods (C functions) that operate on datatype objects. New datatypes can be created
+ * from scratch or copied from existing datatypes.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig5.gif "The datatype object"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 8. General operations on datatype objects</caption>
+ * <tr>
+ * <th>
+ * API Function
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref hid_t \ref H5Tcreate (\ref H5T_class_t class, size_t size)
+ * </td>
+ * <td>
+ * Create a new datatype object of datatype class . The following datatype classes care supported
+ * with this function:
+ * \li #H5T_COMPOUND
+ * \li #H5T_OPAQUE
+ * \li #H5T_ENUM
+ * \li Other datatypes are created with \ref H5Tcopy().
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref hid_t \ref H5Tcopy (\ref hid_t type)
+ * </td>
+ * <td>
+ * Obtain a modifiable transient datatype which is a copy of type. If type is a dataset identifier
+ * then the type returned is a modifiable transient copy of the datatype of the specified dataset.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref hid_t \ref H5Topen (\ref hid_t location, const char *name, #H5P_DEFAULT)
+ * </td>
+ * <td>
+ * Open a committed datatype. The committed datatype returned by this function is read-only.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref htri_t \ref H5Tequal (\ref hid_t type1, \ref hid_t type2)
+ * </td>
+ * <td>
+ * Determines if two types are equal.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tclose (\ref hid_t type)
+ * </td>
+ * <td>
+ * Releases resources associated with a datatype obtained from \ref H5Tcopy, \ref H5Topen, or
+ * \ref H5Tcreate. It is illegal to close an immutable transient datatype (for example, predefined types).
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tcommit (\ref hid_t location, const char *name, hid_t type,
+ * #H5P_DEFAULT, #H5P_DEFAULT, #H5P_DEFAULT)
+ * </td>
+ * <td>
+ * Commit a transient datatype (not immutable) to a file to become a committed datatype. Committed
+ * datatypes can be shared.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref htri_t \ref H5Tcommitted (\ref hid_t type)
+ * </td>
+ * <td>
+ * Test whether the datatype is transient or committed (named).
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tlock (\ref hid_t type)
+ * </td>
+ * <td>
+ * Make a transient datatype immutable (read-only and not closable). Predefined types are locked.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * In order to use a datatype, the object must be created (\ref H5Tcreate), or a reference obtained by
+ * cloning from an existing type (\ref H5Tcopy), or opened (\ref H5Topen). In addition, a reference to the
+ * datatype of a dataset or attribute can be obtained with \ref H5Dget_type or \ref H5Aget_type. For
+ * composite datatypes a reference to the datatype for members or base types can be obtained
+ * (\ref H5Tget_member_type, \ref H5Tget_super). When the datatype object is no longer needed, the
+ * reference is discarded with \ref H5Tclose.
+ *
+ * Two datatype objects can be tested to see if they are the same with \ref H5Tequal. This function
+ * returns true if the two datatype references refer to the same datatype object. However, if two
+ * datatype objects define equivalent datatypes (the same datatype class and datatype properties),
+ * they will not be considered ‘equal’.
+ *
+ * A datatype can be written to the file as a first class object (\ref H5Tcommit). This is a committed
+ * datatype and can be used in thesame way as any other datatype.
+ *
+ * \subsubsection subsubsec_datatype_program_discover Discovery of Datatype Properties
+ * Any HDF5 datatype object can be queried to discover all of its datatype properties. For each
+ * datatype class, there are a set of API functions to retrieve the datatype properties for this class.
+ *
+ * <h4>Properties of Atomic Datatypes</h4>
+ * Table 9 lists the functions to discover the properties of atomic datatypes. Table 10 lists the
+ * queries relevant to specific numeric types. Table 11 gives the properties for atomic string
+ * datatype, and Table 12 gives the property of the opaque datatype.
+ *
+ * <table>
+ * <caption align=top>Table 9. Functions to discover properties of atomic datatypes</caption>
+ * <tr>
+ * <th>
+ * API Function
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_class_t \ref H5Tget_class (\ref hid_t type)
+ * </td>
+ * <td>
+ * The datatype class: #H5T_INTEGER, #H5T_FLOAT, #H5T_STRING, #H5T_BITFIELD, #H5T_OPAQUE, #H5T_COMPOUND,
+ * #H5T_REFERENCE, #H5T_ENUM, #H5T_VLEN, #H5T_ARRAY
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * size_t \ref H5Tget_size (\ref hid_t type)
+ * </td>
+ * <td>
+ * The total size of the element in bytes, including padding which may appear on either side of the
+ * actual value.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_order_t \ref H5Tget_order (\ref hid_t type)
+ * </td>
+ * <td>
+ * The byte order describes how the bytes of the datatype are laid out in memory. If the lowest memory
+ * address contains the least significant byte of the datum then it is said to be little-endian or
+ * #H5T_ORDER_LE. If the bytes are in the opposite order then they are said to be big-endianor #H5T_ORDER_BE.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * size_t \ref H5Tget_precision (\ref hid_t type)
+ * </td>
+ * <td>
+ * The precision property identifies the number of significant bits of a datatype and the offset property
+ * (defined below) identifies its location. Some datatypes occupy more bytes than what is needed to store
+ * the value. For instance, a short on a Cray is 32 significant bits in an eight-byte field.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * int \ref H5Tget_offset (\ref hid_t type)
+ * </td>
+ * <td>
+ * The offset property defines the bit location of the least significant bit of a bit field whose length
+ * is precision.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tget_pad (\ref hid_t type, \ref H5T_pad_t *lsb, \ref H5T_pad_t *msb)
+ * </td>
+ * <td>
+ * Padding is the bits of a data element which are not significant as defined by the precision and offset
+ * properties. Padding in the low-numbered bits is lsb padding and padding in the high-numbered bits is msb
+ * padding. Padding bits can be set to zero (#H5T_PAD_ZERO) or one (#H5T_PAD_ONE).
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 10. Functions to discover properties of atomic datatypes</caption>
+ * <tr>
+ * <th>
+ * API Function
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_sign_t \ref H5Tget_sign (\ref hid_t type)
+ * </td>
+ * <td>
+ * (INTEGER)Integer data can be signed two’s complement (#H5T_SGN_2) or unsigned (#H5T_SGN_NONE).
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tget_fields (\ref hid_t type, size_t *spos, size_t *epos, size_t *esize,
+ * size_t*mpos, size_t *msize)
+ * </td>
+ * <td>
+ * (FLOAT)A floating-point data element has bit fields which are the exponent and mantissa as well as a
+ * mantissa sign bit. These properties define the location (bit position of least significant bit of the
+ * field) and size (in bits) of each field. The sign bit is always of length one and none of the fields
+ * are allowed to overlap.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * size_t \ref H5Tget_ebias (\ref hid_t type)
+ * </td>
+ * <td>
+ * (FLOAT)A floating-point data element has bit fields which are the exponent and
+ * mantissa as well as a mantissa sign bit. These properties define the location (bit
+ * position of least significant bit of the field) and size (in bits) of
+ * each field. The sign bit is always of length one and none of the
+ * fields are allowed to overlap.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_norm_t \ref H5Tget_norm (\ref hid_t type)
+ * </td>
+ * <td>
+ * (FLOAT)This property describes the normalization method of the mantissa.
+ * <ul><li>#H5T_NORM_MSBSET: the mantissa is shifted left (if non-zero) until the first bit
+ * after the radix point is set and the exponent is adjusted accordingly. All bits of the
+ * mantissa after the radix point are stored. </li>
+ * <li>#H5T_NORM_IMPLIED: the mantissa is shifted left \(if non-zero) until the first
+ * bit after the radix point is set and the exponent is adjusted accordingly. The first
+ * bit after the radix point is not stored since it’s always set. </li>
+ * <li>#H5T_NORM_NONE: the fractional part of the mantissa is stored without normalizing it.</li></ul>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_pad_t \ref H5Tget_inpad (\ref hid_t type)
+ * </td>
+ * <td>
+ * (FLOAT)If any internal bits (that is, bits between the sign bit, the mantissa field,
+ * and the exponent field but within the precision field) are unused, then they will be
+ * filled according to the value of this property. The padding can be:
+ * #H5T_PAD_BACKGROUND, #H5T_PAD_ZERO,or #H5T_PAD_ONE.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 11. Functions to discover properties of atomic string datatypes</caption>
+ * <tr>
+ * <th>
+ * API Function
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_cset_t \ref H5Tget_cset (\ref hid_t type)
+ * </td>
+ * <td>
+ * Two character sets are currently supported:
+ * ASCII (#H5T_CSET_ASCII) and UTF-8 (#H5T_CSET_UTF8).
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_str_t \ref H5Tget_strpad (\ref hid_t type)
+ * </td>
+ * <td>
+ * The string datatype has a fixed length, but the string may be shorter than the length.
+ * This property defines the storage mechanism for the left over bytes. The options are:
+ * \li #H5T_STR_NULLTERM
+ * \li #H5T_STR_NULLPAD
+ * \li #H5T_STR_SPACEPAD.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 12. Functions to discover properties of atomic opaque datatypes</caption>
+ * <tr>
+ * <th>
+ * API Function
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * char* \ref H5Tget_tag(\ref hid_t type_id)
+ * </td>
+ * <td>
+ * A user-defined string.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Properties of Composite Datatypes</h4>
+ * The composite datatype classes can also be analyzed to discover their datatype properties and the
+ * datatypes that are members or base types of the composite datatype. The member or base type
+ * can, in turn, be analyzed. The table below lists the functions that can access the datatype
+ * properties of the different composite datatypes.
+ *
+ * <table>
+ * <caption align=top>Table 13. Functions to discover properties of composite datatypes</caption>
+ * <tr>
+ * <th>
+ * API Function
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * int \ref H5Tget_nmembers(\ref hid_t type_id)
+ * </td>
+ * <td>
+ * (COMPOUND)The number of fields in the compound datatype.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref H5T_class_t \ref H5Tget_member_class (\ref hid_t cdtype_id, unsigned member_no)
+ * </td>
+ * <td>
+ * (COMPOUND)The datatype class of compound datatype member member_no.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * char* \ref H5Tget_member_name (\ref hid_t type_id, unsigned field_idx)
+ * </td>
+ * <td>
+ * (COMPOUND)The name of field field_idx of a compound datatype.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * size_t \ref H5Tget_member_offset (\ref hid_t type_id, unsigned memb_no)
+ * </td>
+ * <td>
+ * (COMPOUND)The byte offset of the beginning of a field within a compound datatype.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref hid_t \ref H5Tget_member_type (\ref hid_t type_id, unsigned field_idx)
+ * </td>
+ * <td>
+ * (COMPOUND)The datatype of the specified member.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * int \ref H5Tget_array_ndims (\ref hid_t adtype_id)
+ * </td>
+ * <td>
+ * (ARRAY)The number of dimensions (rank) of the array datatype object.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * int \ref H5Tget_array_dims (\ref hid_t adtype_id, hsize_t *dims[])
+ * </td>
+ * <td>
+ * (ARRAY)The sizes of the dimensions and the dimension permutations of the array datatype object.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref hid_t \ref H5Tget_super(\ref hid_t type)
+ * </td>
+ * <td>
+ * (ARRAY, VL, ENUM)The base datatype from which the datatype type is derived.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tenum_nameof(\ref hid_t type, const void *value, char *name, size_t size)
+ * </td>
+ * <td>
+ * (ENUM)The symbol name that corresponds to the specified value of the enumeration datatype.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tenum_valueof(\ref hid_t type, const char *name, void *value)
+ * </td>
+ * <td>
+ * (ENUM)The value that corresponds to the specified name of the enumeration datatype.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tget_member_value (\ref hid_t type unsigned memb_no, void *value)
+ * </td>
+ * <td>
+ * (ENUM)The value of the enumeration datatype member memb_no.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_datatype_program_define Definition of Datatypes
+ * The HDF5 library enables user programs to create and modify datatypes. The essential steps are:
+ * <ul><li>1. Create a new datatype object of a specific composite datatype class, or copy an existing
+ * atomic datatype object</li>
+ * <li>2. Set properties of the datatype object</li>
+ * <li>3. Use the datatype object</li>
+ * <li>4. Close the datatype object</li></ul>
+ *
+ * To create a user-defined atomic datatype, the procedure is to clone a predefined datatype of the
+ * appropriate datatype class (\ref H5Tcopy), and then set the datatype properties appropriate to the
+ * datatype class. The table below shows how to create a datatype to describe a 1024-bit unsigned
+ * integer.
+ *
+ * <em>Create a new datatype</em>
+ * \code
+ * hid_t new_type = H5Tcopy (H5T_NATIVE_INT);
+ *
+ * H5Tset_precision(new_type, 1024);
+ * H5Tset_sign(new_type, H5T_SGN_NONE);
+ * \endcode
+ *
+ * Composite datatypes are created with a specific API call for each datatype class. The table below
+ * shows the creation method for each datatype class. A newly created datatype cannot be used until the
+ * datatype properties are set. For example, a newly created compound datatype has no members and cannot
+ * be used.
+ *
+ * <table>
+ * <caption align=top>Table 14. Functions to create each datatype class</caption>
+ * <tr>
+ * <th>
+ * Datatype Class
+ * </th>
+ * <th>
+ * Function to Create
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * COMPOUND
+ * </td>
+ * <td>
+ * #H5Tcreate
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * OPAQUE
+ * </td>
+ * <td>
+ * #H5Tcreate
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * ENUM
+ * </td>
+ * <td>
+ * #H5Tenum_create
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * ARRAY
+ * </td>
+ * <td>
+ * #H5Tarray_create
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * VL
+ * </td>
+ * <td>
+ * #H5Tvlen_create
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Once the datatype is created and the datatype properties set, the datatype object can be used.
+ *
+ * Predefined datatypes are defined by the library during initialization using the same mechanisms
+ * as described here. Each predefined datatype is locked (\ref H5Tlock), so that it cannot be changed or
+ * destroyed. User-defined datatypes may also be locked using \ref H5Tlock.
+ *
+ * <h4>User-defined Atomic Datatypes</h4>
+ * Table 15 summarizes the API methods that set properties of atomic types. Table 16 shows
+ * properties specific to numeric types, Table 17 shows properties specific to the string datatype
+ * class. Note that offset, pad, etc. do not apply to strings. Table 18 shows the specific property of
+ * the OPAQUE datatype class.
+ *
+ * <table>
+ * <caption align=top>Table 15. API methods that set properties of atomic datatypes</caption>
+ * <tr>
+ * <th>
+ * Functions
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_size (\ref hid_t type, size_t size)
+ * </td>
+ * <td>
+ * Set the total size of the element in bytes. This includes padding which may appear on either
+ * side of the actual value. If this property is reset to a smaller value which would cause the
+ * significant part of the data to extend beyond the edge of the datatype, then the offset property
+ * is decremented a bit at a time. If the offset reaches zero and the significant part of the data
+ * still extends beyond the edge of the datatype then the precision property is decremented a bit at
+ * a time. Decreasing the size of a datatype may fail if the #H5T_FLOAT bit fields would extend beyond
+ * the significant part of the type.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_order (\ref hid_t type, \ref H5T_order_t order)
+ * </td>
+ * <td>
+ * Set the byte order to little-endian (#H5T_ORDER_LE) or big-endian (#H5T_ORDER_BE).
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_precision (\ref hid_t type, size_t precision)
+ * </td>
+ * <td>
+ * Set the number of significant bits of a datatype. The offset property (defined below) identifies
+ * its location. The size property defined above represents the entire size (in bytes) of the datatype.
+ * If the precision is decreased then padding bits are inserted on the MSB side of the significant
+ * bits (this will fail for #H5T_FLOAT types if it results in the sign,mantissa, or exponent bit field
+ * extending beyond the edge of the significant bit field). On the other hand, if the precision is
+ * increased so that it “hangs over” the edge of the total size then the offset property is decremented
+ * a bit at a time. If the offset reaches zero and the significant bits still hang over the edge, then
+ * the total size is increased a byte at a time.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_offset (\ref hid_t type, size_t offset)
+ * </td>
+ * <td>
+ * Set the bit location of the least significant bit of a bit field whose length is precision. The
+ * bits of the entire data are numbered beginning at zero at the least significant bit of the least
+ * significant byte (the byte at the lowest memory address for a little-endian type or the byte at
+ * the highest address for a big-endian type). The offset property defines the bit location of the
+ * least significant bit of a bit field whose length is precision. If the offset is increased so the
+ * significant bits “hang over” the edge of the datum, then the size property is automatically incremented.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_pad (\ref hid_t type, \ref H5T_pad_t lsb, \ref H5T_pad_t msb)
+ * </td>
+ * <td>
+ * Set the padding to zeros (#H5T_PAD_ZERO) or ones (#H5T_PAD_ONE). Padding is the bits of a
+ * data element which are not significant as defined by the precision and offset properties. Padding
+ * in the low-numbered bits is lsb padding and padding in the high-numbered bits is msb padding.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 16. API methods that set properties of numeric datatypes</caption>
+ * <tr>
+ * <th>
+ * Functions
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_sign (\ref hid_t type, \ref H5T_sign_t sign)
+ * </td>
+ * <td>
+ * (INTEGER)Integer data can be signed two’s complement (#H5T_SGN_2) or unsigned (#H5T_SGN_NONE).
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_fields (\ref hid_t type, size_t spos, size_t epos, size_t esize,
+ * size_t mpos, size_t msize)
+ * </td>
+ * <td>
+ * (FLOAT)Set the properties define the location (bit position of least significant bit of the field)
+ * and size (in bits) of each field. The sign bit is always of length one and none of the fields are
+ * allowed to overlap.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_ebias (\ref hid_t type, size_t ebias)
+ * </td>
+ * <td>
+ * (FLOAT)The exponent is stored as a non-negative value which is ebias larger than the true exponent.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_norm (\ref hid_t type, \ref H5T_norm_t norm)
+ * </td>
+ * <td>
+ * (FLOAT)This property describes the normalization method of the mantissa.
+ * <ul><li>#H5T_NORM_MSBSET: the mantissa is shifted left (if non-zero) until the first bit
+ * after theradix point is set and the exponent is adjusted accordingly. All bits of the
+ * mantissa after the radix point are stored. </li>
+ * <li>#H5T_NORM_IMPLIED: the mantissa is shifted left (if non-zero) until the first bit
+ * after the radix point is set and the exponent is adjusted accordingly. The first bit after
+ * the radix point is not stored since it is always set. </li>
+ * <li>#H5T_NORM_NONE: the fractional part of the mantissa is stored without normalizing it.</li></ul>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_inpad (\ref hid_t type, \ref H5T_pad_t inpad)
+ * </td>
+ * <td>
+ * (FLOAT)
+If any internal bits (that is, bits between the sign bit, the mantissa field,
+and the exponent field but within the precision field) are unused, then they will be
+filled according to the value of this property. The padding can be:
+ * \li #H5T_PAD_BACKGROUND
+ * \li #H5T_PAD_ZERO
+ * \li #H5T_PAD_ONE
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 17. API methods that set properties of string datatypes</caption>
+ * <tr>
+ * <th>
+ * Functions
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_size (\ref hid_t type, size_t size)
+ * </td>
+ * <td>
+ * Set the length of the string, in bytes. The precision is automatically set to 8*size.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_precision (\ref hid_t type, size_t precision)
+ * </td>
+ * <td>
+ * The precision must be a multiple of 8.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_cset (\ref hid_t type_id, \ref H5T_cset_t cset)
+ * </td>
+ * <td>
+ * Two character sets are currently supported:
+ * \li ASCII (#H5T_CSET_ASCII)
+ * \li UTF-8 (#H5T_CSET_UTF8).
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_strpad (\ref hid_t type_id, H5T_str_t strpad)
+ * </td>
+ * <td>
+ * The string datatype has a fixed length, but the string may be shorter than the length. This
+ * property defines the storage mechanism for the left over bytes. The method used to store
+ * character strings differs with the programming language:
+ * \li C usually null terminates strings
+ * \li Fortran left-justifies and space-pads strings
+ *
+ * Valid string padding values, as passed in the parameter strpad, are as follows:
+ * \li #H5T_STR_NULLTERM: Null terminate (as C does)
+ * \li #H5T_STR_NULLPAD: Pad with zeros
+ * \li #H5T_STR_SPACEPAD: Pad with spaces (as FORTRAN does)
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption align=top>Table 18. API methods that set properties of opaque datatypes</caption>
+ * <tr>
+ * <th>
+ * Functions
+ * </th>
+ * <th>
+ * Description
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \ref herr_t \ref H5Tset_tag (\ref hid_t type_id, const char *tag)
+ * </td>
+ * <td>
+ * Tags the opaque datatype type_id with an ASCII identifier tag.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Examples</h4>
+ * The example below shows how to create a 128-bit little-endian signed integer type. Increasing
+ * the precision of a type automatically increases the total size. Note that the proper
+ * procedure is to begin from a type of the intended datatype class which in this case is a
+ * NATIVE INT.
+ *
+ * <em>Create a new 128-bit little-endian signed integer datatype</em>
+ * \code
+ * hid_t new_type = H5Tcopy (H5T_NATIVE_INT);
+ * H5Tset_precision (new_type, 128);
+ * H5Tset_order (new_type, H5T_ORDER_LE);
+ * \endcode
+ *
+ * The figure below shows the storage layout as the type is defined. The \ref H5Tcopy creates a
+ * datatype that is the same as #H5T_NATIVE_INT. In this example, suppose this is a 32-bit
+ * big-endian number (Figure a). The precision is set to 128 bits, which automatically extends
+ * the size to 8 bytes (Figure b). Finally, the byte order is set to little-endian (Figure c).
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig6.gif "The storage layout for a new 128-bit little-endian signed integer datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The significant bits of a data element can be offset from the beginning of the memory for that
+ * element by an amount of padding. The offset property specifies the number of bits of padding
+ * that appear to the “right of” the value. The table and figure below show how a 32-bit unsigned
+ * integer with 16-bits of precision having the value 0x1122 will be laid out in memory.
+ *
+ * <table>
+ * <caption align=top>Table 19. Memory Layout for a 32-bit unsigned integer</caption>
+ * <tr>
+ * <th>
+ * Byte Position
+ * </th>
+ * <th>
+ * Big-Endian<br />Offset=0
+ * </th>
+ * <th>
+ * Big-Endian<br />Offset=16
+ * </th>
+ * <th>
+ * Little-Endian<br />Offset=0
+ * </th>
+ * <th>
+ * Little-Endian<br />Offset=16
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * 0:
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * <td>
+ * [0x11]
+ * </td>
+ * <td>
+ * [0x22]
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * 1:
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * <td>
+ * [0x22]
+ * </td>
+ * <td>
+ * [0x11]
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * 2:
+ * </td>
+ * <td>
+ * [0x11]
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * <td>
+ * [0x22]
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * 3:
+ * </td>
+ * <td>
+ * [0x22]
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * <td>
+ * [pad]
+ * </td>
+ * <td>
+ * [0x11]
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig7.gif "Memory Layout for a 32-bit unsigned integer"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * 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 datatype.
+ *
+ * The bits of the entire data are numbered beginning at zero at the least significant bit of the least
+ * significant byte (the byte at the lowest memory address for a little-endian type or the byte at the
+ * highest address for a big-endian type). The offset property defines the bit location of the least
+ * significant bit of a bit field whose length is precision. If the offset is increased so the significant
+ * bits “hang over” the edge of the datum, then the size property is automatically incremented.
+ *
+ * To illustrate the properties of the integer datatype class, the example below shows how to create
+ * a user-defined datatype that describes a 24-bit signed integer that starts on the third bit of a 32-bit
+ * word. The datatype is specialized from a 32-bit integer, the precision is set to 24 bits, and the
+ * offset is set to 3.
+ *
+ * <em>A user-defined datatype with a 24-bit signed integer</em>
+ * \code
+ * hid_t dt;
+ *
+ * dt = H5Tcopy(H5T_SDT_I32LE);
+ * H5Tset_precision(dt, 24);
+ * H5Tset_offset(dt,3);
+ * H5Tset_pad(dt, H5T_PAD_ZERO, H5T_PAD_ONE);
+ * \endcode
+ *
+ * The figure below shows the storage layout for a data element. Note that the unused bits in the
+ * offset will be set to zero and the unused bits at the end will be set to one, as specified in the
+ * \ref H5Tset_pad call.
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig8.gif "A user-defined integer datatype with a range of -1,048,583 to 1,048,584"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * To illustrate a user-defined floating point number, the example below shows how to create a 24-bit
+ * floating point number that starts 5 bits into a 4 byte word. The floating point number is defined to
+ * have a mantissa of 19 bits (bits 5-23), an exponent of 3 bits (25-27), and the sign bit is bit 28.
+ * (Note that this is an illustration of what can be done and is not necessarily a floating point
+ * format that a user would require.)
+ *
+ * <em>A user-defined datatype with a 24-bit floating point datatype</em>
+ * \code
+ * hid_t dt;
+ *
+ * dt = H5Tcopy(H5T_SDT_F32LE);
+ * H5Tset_precision(dt, 24);
+ * H5Tset_fields (dt, 28, 25, 3, 5, 19);
+ * H5Tset_pad(dt, H5T_PAD_ZERO, H5T_PAD_ONE);
+ * H5Tset_inpad(dt, H5T_PAD_ZERO);
+ * \endcode
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig9.gif "A user-defined floating point datatype"
+ * </td>
+ * </tr>
+ * </table>
+ * The figure above shows the storage layout of a data element for this datatype. Note that there is
+ * an unused bit (24) between the mantissa and the exponent. This bit is filled with the inpad value
+ * which in this case is 0.
+ *
+ * The sign bit is always of length one and none of the fields are allowed to overlap. When
+ * expanding a floating-point type one should set the precision first; when decreasing the size one
+ * should set the field positions and sizes first.
+ *
+ * <h4>Composite Datatypes</h4>
+ * All composite datatypes must be user-defined; there are no predefined composite datatypes.
+ *
+ * <h4>Compound Datatypes</h4>
+ * The subsections below describe how to create a compound datatype and how to write and read
+ * data of a compound datatype.
+ *
+ * <h4>Defining Compound Datatypes</h4>
+ *
+ * Compound datatypes are conceptually similar to a C struct or Fortran derived types. The
+ * compound datatype defines a contiguous sequence of bytes, which are formatted using one up to
+ * 2^16 datatypes (members). A compound datatype may have any number of members, in any
+ * order, and the members may have any datatype, including compound. Thus, complex nested
+ * compound datatypes can be created. The total size of the compound datatype is greater than or
+ * equal to the sum of the size of its members, up to a maximum of 2^32 bytes. HDF5 does not
+ * support datatypes with distinguished records or the equivalent of C unions or Fortran
+ * EQUIVALENCE statements.
+ *
+ * Usually a C struct or Fortran derived type will be defined to hold a data point in memory, and the
+ * offsets of the members in memory will be the offsets of the struct members from the beginning
+ * of an instance of the struct. The HDF5 C library provides a macro #HOFFSET (s,m)to calculate
+ * the member’s offset. The HDF5 Fortran applications have to calculate offsets by using sizes of
+ * members datatypes and by taking in consideration the order of members in the Fortran derived type.
+ * \code
+ * HOFFSET(s,m)
+ * \endcode
+ * This macro computes the offset of member m within a struct s
+ * \code
+ * offsetof(s,m)
+ * \endcode
+ * This macro defined in stddef.h does exactly the same thing as the HOFFSET()macro.
+ *
+ * Note for Fortran users: Offsets of Fortran structure members correspond to the offsets within a
+ * packed datatype (see explanation below) stored in an HDF5 file.
+ *
+ * Each member of a compound datatype must have a descriptive name which is the key used to
+ * uniquely identify the member within the compound datatype. A member name in an HDF5
+ * datatype does not necessarily have to be the same as the name of the member in the C struct or
+ * Fortran derived type, although this is often the case. Nor does one need to define all members of
+ * the C struct or Fortran derived type in the HDF5 compound datatype (or vice versa).
+ *
+ * Unlike atomic datatypes which are derived from other atomic datatypes, compound datatypes are
+ * created from scratch. First, one creates an empty compound datatype and specifies its total size.
+ * Then members are added to the compound datatype in any order. Each member type is inserted
+ * at a designated offset. Each member has a name which is the key used to uniquely identify the
+ * member within the compound datatype.
+ *
+ * The example below shows a way of creating an HDF5 C compound datatype to describe a
+ * complex number. This is a structure with two components, “real” and “imaginary”, and each
+ * component is a double. An equivalent C struct whose type is defined by the complex_tstruct is
+ * shown.
+ *
+ * <em>A compound datatype for complex numbers in C</em>
+ * \code
+ * typedef struct {
+ * double re; //real part
+ * double im; //imaginary part
+ * } complex_t;
+ *
+ * hid_t complex_id = H5Tcreate (H5T_COMPOUND, sizeof (complex_t));
+ * H5Tinsert (complex_id, “real”, HOFFSET(complex_t,re),
+ * H5T_NATIVE_DOUBLE);
+ * H5Tinsert (complex_id, “imaginary”, HOFFSET(complex_t,im),
+ * H5T_NATIVE_DOUBLE);
+ * \endcode
+ *
+ * The example below shows a way of creating an HDF5 Fortran compound datatype to describe a
+ * complex number. This is a Fortran derived type with two components, “real” and “imaginary”,
+ * and each component is DOUBLE PRECISION. An equivalent Fortran TYPE whose type is defined
+ * by the TYPE complex_t is shown.
+ *
+ * <em>A compound datatype for complex numbers in Fortran</em>
+ * \code
+ * TYPE complex_t
+ * DOUBLE PRECISION re ! real part
+ * DOUBLE PRECISION im; ! imaginary part
+ * END TYPE complex_t
+ *
+ * CALL h5tget_size_f(H5T_NATIVE_DOUBLE, re_size, error)
+ * CALL h5tget_size_f(H5T_NATIVE_DOUBLE, im_size, error)
+ * complex_t_size = re_size + im_size
+ * CALL h5tcreate_f(H5T_COMPOUND_F, complex_t_size, type_id)
+ * offset = 0
+ * CALL h5tinsert_f(type_id, “real”, offset, H5T_NATIVE_DOUBLE, error)
+ * offset = offset + re_size
+ * CALL h5tinsert_f(type_id, “imaginary”, offset, H5T_NATIVE_DOUBLE, error)
+ * \endcode
+ *
+ * Important Note: The compound datatype is created with a size sufficient to hold all its members.
+ * In the C example above, the size of the C struct and the #HOFFSET macro are used as a
+ * convenient mechanism to determine the appropriate size and offset. Alternatively, the size and
+ * offset could be manually determined: the size can be set to 16 with “real” at offset 0 and
+ * “imaginary” at offset 8. However, different platforms and compilers have different sizes for
+ * “double” and may have alignment restrictions which require additional padding within the
+ * structure. It is much more portable to use the #HOFFSET macro which assures that the values will
+ * be correct for any platform.
+ *
+ * The figure below shows how the compound datatype would be laid out assuming that
+ * NATIVE_DOUBLE are 64-bit numbers and that there are no alignment requirements. The total
+ * size of the compound datatype will be 16 bytes, the “real” component will start at byte 0, and
+ * “imaginary” will start at byte 8.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig10.gif "Layout of a compound datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The members of a compound datatype may be any HDF5 datatype including the compound,
+ * array, and variable-length (VL) types. The figure and example below show the memory layout
+ * and code which creates a compound datatype composed of two complex values, and each
+ * complex value is also a compound datatype as in the figure above.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig11.gif "Layout of a compound datatype nested in a compound datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <em>Code for a compound datatype nested in a compound datatype</em>
+ * \code
+ * typedef struct {
+ * complex_t x;
+ * complex_t y;
+ * } surf_t;
+ *
+ * hid_t complex_id, surf_id; // hdf5 datatypes
+ *
+ * complex_id = H5Tcreate (H5T_COMPOUND, sizeof(complex_t));
+ * H5Tinsert (complex_id, “re”, HOFFSET(complex_t, re), H5T_NATIVE_DOUBLE);
+ * H5Tinsert (complex_id, “im”, HOFFSET(complex_t, im), H5T_NATIVE_DOUBLE);
+ *
+ * surf_id = H5Tcreate (H5T_COMPOUND, sizeof(surf_t));
+ * H5Tinsert (surf_id, “x”, HOFFSET(surf_t, x), complex_id);
+ * H5Tinsert (surf_id, “y”, HOFFSET(surf_t, y), complex_id);
+ * \endcode
+ *
+ * Note that a similar result could be accomplished by creating a compound datatype and inserting
+ * four fields. See the figure below. This results in the same layout as the figure above. The difference
+ * would be how the fields are addressed. In the first case, the real part of ‘y’ is called ‘y.re’;
+ * in the second case it is ‘y-re’.
+ *
+ * <em>Another compound datatype nested in a compound datatype</em>
+ * \code
+ * typedef struct {
+ * complex_t x;
+ * complex_t y;
+ * } surf_t;
+ *
+ * hid_t surf_id = H5Tcreate (H5T_COMPOUND, sizeof(surf_t));
+ * H5Tinsert (surf_id, “x-re”, HOFFSET(surf_t, x.re), H5T_NATIVE_DOUBLE);
+ * H5Tinsert (surf_id, “x-im”, HOFFSET(surf_t, x.im), H5T_NATIVE_DOUBLE);
+ * H5Tinsert (surf_id, “y-re”, HOFFSET(surf_t, y.re), H5T_NATIVE_DOUBLE);
+ * H5Tinsert (surf_id, “y-im”, HOFFSET(surf_t, y.im), H5T_NATIVE_DOUBLE);
+ * \endcode
+ *
+ * The members of a compound datatype do not always fill all the bytes. The #HOFFSET macro
+ * assures that the members will be laid out according to the requirements of the platform and
+ * language. The example below shows an example of a C struct which requires extra bytes of
+ * padding on many platforms. The second element, ‘b’, is a 1-byte character followed by an 8 byte
+ * double, ‘c’. On many systems, the 8-byte value must be stored on a 4-or 8-byte boundary. This
+ * requires the struct to be larger than the sum of the size of its elements.
+ *
+ * In the example below, sizeof and #HOFFSET are used to assure that the members are inserted at
+ * the correct offset to match the memory conventions of the platform. The figure below shows how
+ * this data element would be stored in memory, assuming the double must start on a 4-byte
+ * boundary. Notice the extra bytes between ‘b’ and ‘c’.
+ *
+ * <em>A compound datatype that requires padding</em>
+ * \code
+ * typedef struct {
+ * int a;
+ * char b;
+ * double c;
+ * } s1_t;
+ *
+ * hid_t s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
+ * H5Tinsert (s1_tid, “x-im”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
+ * H5Tinsert (s1_tid, “y-re”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
+ * H5Tinsert (s1_tid, “y-im”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
+ * \endcode
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig12.gif "Memory layout of a compound datatype that requires padding"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * However, data stored on disk does not require alignment, so unaligned versions of compound
+ * data structures can be created to improve space efficiency on disk. These unaligned compound
+ * datatypes can be created by computing offsets by hand to eliminate inter-member padding, or the
+ * members can be packed by calling #H5Tpack (which modifies a datatype directly, so it is usually
+ * preceded by a call to #H5Tcopy).
+ *
+ * The example below shows how to create a disk version of the compound datatype from the
+ * figure above in order to store data on disk in as compact a form as possible. Packed compound
+ * datatypes should generally not be used to describe memory as they may violate alignment
+ * constraints for the architecture being used. Note also that using a packed datatype for disk
+ * storage may involve a higher data conversion cost.
+ *
+ * <em>Create a packed compound datatype in C</em>
+ * \code
+ * hid_t s2_tid = H5Tcopy (s1_tid);
+ * H5Tpack (s2_tid);
+ * \endcode
+ *
+ * The example below shows the sequence of Fortran calls to create a packed compound datatype.
+ * An HDF5 Fortran compound datatype never describes a compound datatype in memory and
+ * compound data is ALWAYS written by fields as described in the next section. Therefore packing
+ * is not needed unless the offset of each consecutive member is not equal to the sum of the sizes of
+ * the previous members.
+ *
+ * <em>Create a packed compound datatype in Fortran</em>
+ * \code
+ * CALL h5tcopy_f(s1_id, s2_id, error)
+ * CALL h5tpack_f(s2_id, error)
+ * \endcode
+ *
+ * <h4>Creating and Writing Datasets with Compound Datatypes</h4>
+ *
+ * Creating datasets with compound datatypes is similar to creating datasets with any other HDF5
+ * datatypes. But writing and reading may be different since datasets that have compound datatypes
+ * can be written or read by a field (member) or subsets of fields (members). The compound
+ * datatype is the only composite datatype that supports “sub-setting” by the elements the datatype
+ * is built from.
+ *
+ * The example below shows a C example of creating and writing a dataset with a compound
+ * datatype.
+ *
+ *
+ * <em>Create and write a dataset with a compound datatype in C</em>
+ * \code
+ * typedef struct s1_t {
+ * int a;
+ * float b;
+ * double c;
+ * } s1_t;
+ *
+ * s1_t data[LENGTH];
+ *
+ * // Initialize data
+ * for (i = 0; i < LENGTH; i++) {
+ * data[i].a = i;
+ * data[i].b = i*i;
+ * data[i].c = 1./(i+1);
+ * }
+ *
+ * ...
+ *
+ * s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
+ * H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
+ * H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
+ * H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
+ *
+ * ...
+ *
+ * dataset_id = H5Dcreate(file_id, “SDScompound.h5”, s1_t,
+ * space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * H5Dwrite (dataset_id, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+ * \endcode
+ *
+ * The example below shows the content of the file written on a little-endian machine.
+ * <em>Create and write a little-endian dataset with a compound datatype in C</em>
+ * \code
+ * HDF5 “SDScompound.h5” {
+ * GROUP “/” {
+ * DATASET “ArrayOfStructures” {
+ * DATATYPE H5T_COMPOUND {
+ * H5T_STD_I32LE “a_name”;
+ * H5T_IEEE_F32LE “b_name”;
+ * H5T_IEEE_F64LE “c_name”;
+ * }
+ * DATASPACE SIMPLE { ( 3 ) / ( 3 ) }
+ * DATA {
+ * (0): {
+ * 0,
+ * 0,
+ * 1
+ * },
+ * (1): {
+ * 0,
+ * 1,
+ * 0.5
+ * },
+ * (2): {
+ * 0,
+ * 4,
+ * 0.333333
+ * }
+ * }
+ * }
+ * }
+ * }
+ * \endcode
+ *
+ * It is not necessary to write the whole data at once. Datasets with compound datatypes can be
+ * written by field or by subsets of fields. In order to do this one has to remember to set the transfer
+ * property of the dataset using the H5Pset_preserve call and to define the memory datatype that
+ * corresponds to a field. The example below shows how float and double fields are written to the
+ * dataset.
+ *
+ * <em>Writing floats and doubles to a dataset</em>
+ * \code
+ * typedef struct sb_t {
+ * float b;
+ * double c;
+ * } sb_t;
+ *
+ * typedef struct sc_t {
+ * float b;
+ * double c;
+ * } sc_t;
+ * sb_t data1[LENGTH];
+ * sc_t data2[LENGTH];
+ *
+ * // Initialize data
+ * for (i = 0; i < LENGTH; i++) {
+ * data1.b = i * i;
+ * data2.c = 1./(i + 1);
+ * }
+ *
+ * ...
+ *
+ * // Create dataset as in example 15
+ *
+ * ...
+ *
+ * // Create memory datatypes corresponding to float
+ * // and double datatype fields
+ *
+ * sb_tid = H5Tcreate (H5T_COMPOUND, sizeof(sb_t));
+ * H5Tinsert(sb_tid, “b_name”, HOFFSET(sb_t, b), H5T_NATIVE_FLOAT);
+ * sc_tid = H5Tcreate (H5T_COMPOUND, sizeof(sc_t));
+ * H5Tinsert(sc_tid, “c_name”, HOFFSET(sc_t, c), H5T_NATIVE_DOUBLE);
+ *
+ * ...
+ *
+ * // Set transfer property
+ * xfer_id = H5Pcreate(H5P_DATASET_XFER);
+ * H5Pset_preserve(xfer_id, 1);
+ * H5Dwrite (dataset_id, sb_tid, H5S_ALL, H5S_ALL, xfer_id, data1);
+ * H5Dwrite (dataset_id, sc_tid, H5S_ALL, H5S_ALL, xfer_id, data2);
+ * \endcode
+ *
+ * The figure below shows the content of the file written on a little-endian machine. Only float and
+ * double fields are written. The default fill value is used to initialize the unwritten integer field.
+ * <em>Writing floats and doubles to a dataset on a little-endian system</em>
+ * \code
+ * HDF5 “SDScompound.h5” {
+ * GROUP “/” {
+ * DATASET “ArrayOfStructures” {
+ * DATATYPE H5T_COMPOUND {
+ * H5T_STD_I32LE “a_name”;
+ * H5T_IEEE_F32LE “b_name”;
+ * H5T_IEEE_F64LE “c_name”;
+ * }
+ * DATASPACE SIMPLE { ( 3 ) / ( 3 ) }
+ * DATA {
+ * (0): {
+ * 0,
+ * 0,
+ * 1
+ * },
+ * (1): {
+ * 0,
+ * 1,
+ * 0.5
+ * },
+ * (2): {
+ * 0,
+ * 4,
+ * 0.333333
+ * }
+ * }
+ * }
+ * }
+ * }
+ * \endcode
+ *
+ * The example below contains a Fortran example that creates and writes a dataset with a
+ * compound datatype. As this example illustrates, writing and reading compound datatypes in
+ * Fortran is always done by fields. The content of the written file is the same as shown in the
+ * example above.
+ * <em>Create and write a dataset with a compound datatype in Fortran</em>
+ * \code
+ * ! One cannot write an array of a derived datatype in
+ * ! Fortran.
+ * TYPE s1_t
+ * INTEGER a
+ * REAL b
+ * DOUBLE PRECISION c
+ * END TYPE s1_t
+ * TYPE(s1_t) d(LENGTH)
+ * ! Therefore, the following code initializes an array
+ * ! corresponding to each field in the derived datatype
+ * ! and writesthose arrays to the dataset
+ *
+ * INTEGER, DIMENSION(LENGTH) :: a
+ * REAL, DIMENSION(LENGTH) :: b
+ * DOUBLE PRECISION, DIMENSION(LENGTH) :: c
+ *
+ * ! Initialize data
+ * do i = 1, LENGTH
+ * a(i) = i-1
+ * b(i) = (i-1) * (i-1)
+ * c(i) = 1./i
+ * enddo
+ *
+ * ...
+ *
+ * ! Set dataset transfer property to preserve partially
+ * ! initialized fields during write/read to/from dataset
+ * ! with compound datatype.
+ * !
+ * CALL h5pcreate_f(H5P_DATASET_XFER_F, plist_id, error)
+ * CALL h5pset_preserve_f(plist_id, .TRUE., error)
+ *
+ * ...
+ *
+ * !
+ * ! Create compound datatype.
+ * !
+ * ! First calculate total size by calculating sizes of
+ * ! each member
+ * !
+ * CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, error)
+ * CALL h5tget_size_f(H5T_NATIVE_REAL, type_sizer, error)
+ * CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)
+ * type_size = type_sizei + type_sizer + type_sized
+ * CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dtype_id, error)
+ * !
+ * ! Insert members
+ * !
+ * !
+ * ! INTEGER member
+ * !
+ * offset = 0
+ * CALL h5tinsert_f(dtype_id, “a_name”, offset, H5T_NATIVE_INTEGER, error)
+ * !
+ * ! REAL member
+ * !
+ * offset = offset + type_sizei
+ * CALL h5tinsert_f(dtype_id, “b_name”, offset, H5T_NATIVE_REAL, error)
+ * !
+ * ! DOUBLE PRECISION member
+ * !
+ * offset = offset + type_sizer
+ * CALL h5tinsert_f(dtype_id, “c_name”, offset, H5T_NATIVE_DOUBLE, error)
+ * !
+ * ! Create the dataset with compound datatype.
+ * !
+ * CALL h5dcreate_f(file_id, dsetname, dtype_id, dspace_id, &dset_id, error, H5P_DEFAULT_F,
+ * H5P_DEFAULT_F, H5P_DEFAULT_F)
+ * !
+ *
+ * ...
+ *
+ * ! Create memory types. We have to create a compound
+ * ! datatype for each member we want to write.
+ * !
+ * CALL h5tcreate_f(H5T_COMPOUND_F, type_sizei, dt1_id, error)
+ * offset = 0
+ * CALL h5tinsert_f(dt1_id, “a_name”, offset, H5T_NATIVE_INTEGER, error)
+ * !
+ * CALL h5tcreate_f(H5T_COMPOUND_F, type_sizer, dt2_id, error)
+ * offset = 0
+ * CALL h5tinsert_f(dt2_id, “b_name”, offset, H5T_NATIVE_REAL, error)
+ * !
+ * CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dt3_id, error)
+ * offset = 0
+ * CALL h5tinsert_f(dt3_id, “c_name”, offset, H5T_NATIVE_DOUBLE, error)
+ * !
+ * ! Write data by fields in the datatype. Fields order
+ * ! is not important.
+ * !
+ * CALL h5dwrite_f(dset_id, dt3_id, c, data_dims, error, xfer_prp = plist_id)
+ * CALL h5dwrite_f(dset_id, dt2_id, b, data_dims, error, xfer_prp = plist_id)
+ * CALL h5dwrite_f(dset_id, dt1_id, a, data_dims, error, xfer_prp = plist_id)
+ * \endcode
+ *
+ * <h4>Reading Datasets with Compound Datatypes</h4>
+ *
+ * Reading datasets with compound datatypes may be a challenge. For general applications there is
+ * no way to know a priori the corresponding C structure. Also, C structures cannot be allocated on
+ * the fly during discovery of the dataset’s datatype. For general C, C++, Fortran and Java
+ * application the following steps will be required to read and to interpret data from the dataset with
+ * compound datatype:
+ * \li 1. Get the identifier of the compound datatype in the file with the #H5Dget_type call
+ * \li 2. Find the number of the compound datatype members with the #H5Tget_nmembers call
+ * \li 3. Iterate through compound datatype members
+ * <ul><li>Get member class with the #H5Tget_member_class call</li>
+ * <li>Get member name with the #H5Tget_member_name call</li>
+ * <li>Check class type against predefined classes
+ * <ul><li>#H5T_INTEGER</li>
+ * <li>#H5T_FLOAT</li>
+ * <li>#H5T_STRING</li>
+ * <li>#H5T_BITFIELD</li>
+ * <li>#H5T_OPAQUE</li>
+ * <li>#H5T_COMPOUND</li>
+ * <li>#H5T_REFERENCE</li>
+ * <li>#H5T_ENUM</li>
+ * <li>#H5T_VLEN</li>
+ * <li>#H5T_ARRAY</li></ul>
+ * </li>
+ * <li>If class is #H5T_COMPOUND, then go to step 2 and repeat all steps under step 3. If
+ * class is not #H5T_COMPOUND, then a member is of an atomic class and can be read
+ * to a corresponding buffer after discovering all necessary information specific to each
+ * atomic type (for example, size of the integer or floats, super class for enumerated and
+ * array datatype, and its sizes)</li></ul>
+ *
+ * The examples below show how to read a dataset with a known compound datatype.
+ *
+ * The first example below shows the steps needed to read data of a known structure. First, build a
+ * memory datatype the same way it was built when the dataset was created, and then second use
+ * the datatype in an #H5Dread call.
+ *
+ * <em>Read a dataset using a memory datatype</em>
+ * \code
+ * typedef struct s1_t {
+ * int a;
+ * float b;
+ * double c;
+ * } s1_t;
+ *
+ * s1_t *data;
+ *
+ * ...
+ *
+ * s1_tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
+ * H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
+ * H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
+ * H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
+ *
+ * ...
+ *
+ * dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
+ *
+ * ...
+ *
+ * data = (s1_t *) malloc (sizeof(s1_t)*LENGTH);
+ * H5Dread(dataset_id, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+ * \endcode
+ *
+ * Instead of building a memory datatype, the application could use the
+ * #H5Tget_native_type function. See the example below.
+ *
+ * <em>Read a dataset using H5Tget_native_type</em>
+ * \code
+ * typedef struct s1_t {
+ * int a;
+ * float b;
+ * double c;
+ * } s1_t;
+ *
+ * s1_t *data;
+ * hid_t file_s1_t, mem_s1_t;
+ *
+ * ...
+ *
+ * dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
+ * // Discover datatype in the file
+ * file_s1_t = H5Dget_type(dataset_id);
+ * // Find corresponding memory datatype
+ * mem_s1_t = H5Tget_native_type(file_s1_t, H5T_DIR_DEFAULT);
+ *
+ * ...
+ *
+ * data = (s1_t *) malloc (sizeof(s1_t)*LENGTH);
+ * H5Dread (dataset_id,mem_s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+ * \endcode
+ *
+ * The example below shows how to read just one float member of a compound datatype.
+ *
+ * <em>Read one floating point member of a compound datatype</em>
+ * \code
+ * typedef struct sf_t {
+ * float b;
+ * } sf_t;
+ *
+ * sf_t *data;
+ *
+ * ...
+ *
+ * sf_tid = H5Tcreate(H5T_COMPOUND, sizeof(sf_t));
+ * H5Tinsert(sf_tid, “b_name”, HOFFSET(sf_t, b), H5T_NATIVE_FLOAT);
+ *
+ * ...
+ *
+ * dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
+ *
+ * ...
+ *
+ * data = (sf_t *) malloc (sizeof(sf_t) * LENGTH);
+ * H5Dread(dataset_id, sf_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+ * \endcode
+ *
+ * The example below shows how to read float and double members of a compound datatype into a
+ * structure that has those fields in a different order. Please notice that #H5Tinsert calls can be used
+ * in an order different from the order of the structure’s members.
+ *
+ * <em>Read float and double members of a compound datatype</em>
+ * \code
+ * typedef struct sdf_t {
+ * double c;
+ * float b;
+ * } sdf_t;
+ *
+ * sdf_t *data;
+ *
+ * ...
+ *
+ * sdf_tid = H5Tcreate(H5T_COMPOUND, sizeof(sdf_t));
+ * H5Tinsert(sdf_tid, “b_name”, HOFFSET(sdf_t, b), H5T_NATIVE_FLOAT);
+ * H5Tinsert(sdf_tid, “c_name”, HOFFSET(sdf_t, c), H5T_NATIVE_DOUBLE);
+ *
+ * ...
+ *
+ * dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
+ *
+ * ...
+ *
+ * data = (sdf_t *) malloc (sizeof(sdf_t) * LENGTH);
+ * H5Dread(dataset_id, sdf_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+ * \endcode
+ *
+ * <h4>Array</h4>
+ *
+ * Many scientific datasets have multiple measurements for each point in a space. There are several
+ * natural ways to represent this data, depending on the variables and how they are used in
+ * computation. See the table and the figure below.
+ *
+ * <table>
+ * <caption>Representing data with multiple measurements</caption>
+ * <tr>
+ * <th>
+ * <p>Storage Strategy</p>
+ * </th>
+ * <th>
+ * <p>Stored as</p>
+ * </th>
+ * <th>
+ * <p>Remarks</p>
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>Multiple planes
+ * </td>
+ * <td>
+ * Several datasets with identical dataspaces
+ * </td>
+ * <td>
+ * This is optimal when variables are accessed individually, or when often uses only selected
+ * variables.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Additional dimension
+ * </td>
+ * <td>
+ * One dataset, the last “dimension” is a vec-tor of variables
+ * </td>
+ * <td>
+ * This can give good performance, although selecting only a few variables may be slow. This may
+ * not reflect the science.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Record with multiple values
+ * </td>
+ * <td>
+ * One dataset with compound datatype
+ * </td>
+ * <td>
+ * This enables the variables to be read all together or selected. Also handles “vectors” of
+ * heterogeneous data.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * Vector or Tensor value
+ * </td>
+ * <td>
+ * One dataset, each data element is a small array of values.
+ * </td>
+ * <td>
+ * This uses the same amount of space as the previous two, and may represent the science model
+ * better.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <caption>Figure 13 Representing data with multiple measurements</caption>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig13a.gif
+ * </td>
+ * <td>
+ * \image html Dtypes_fig13b.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig13c.gif
+ * </td>
+ * <td>
+ * \image html Dtypes_fig13d.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The HDF5 #H5T_ARRAY datatype defines the data element to be a homogeneous, multi-dimensional array.
+ * See Figure 13 above. The elements of the array can be any HDF5 datatype
+ * (including compound and array), and the size of the datatype is the total size of the array. A
+ * dataset of array datatype cannot be subdivided for I/O within the data element: the entire array of
+ * the data element must be transferred. If the data elements need to be accessed separately, for
+ * example, by plane, then the array datatype should not be used. The table below shows
+ * advantages and disadvantages of various storage methods.
+ *
+ * <table>
+ * <caption>Storage method advantages and disadvantages</caption>
+ * <tr>
+ * <th>
+ * <p>Method</p>
+ * </th>
+ * <th>
+ * <p>Advantages</p>
+ * </th>
+ * <th>
+ * <p>Disadvantages</p>
+ * </th>
+ * </tr>
+ * <tr>
+ * <td>
+ * Multiple Datasets
+ * </td>
+ * <td>
+ * Easy to access each plane, can select any plane(s)
+ * </td>
+ * <td>
+ * Less efficient to access a ‘column’ through the planes
+ * </td>
+ * </tr>
+ * </tr>
+ * <tr>
+ * <td>
+ * N+1 Dimension
+ * </td>
+ * <td>
+ * All access patterns supported
+ * </td>
+ * <td>
+ * Must be homogeneous datatype<br />
+ * The added dimension may not make sense in the scientific model
+ * </td>
+ * </tr>
+ * </tr>
+ * <tr>
+ * <td>
+ * Compound Datatype
+ * </td>
+ * <td>
+ * Can be heterogeneous datatype
+ * </td>
+ * <td>
+ * Planes must be named, selection is by plane<br />
+ * Not a natural representation for a matrix
+ * </td>
+ * </tr>
+ * </tr>
+ * <tr>
+ * <td>
+ * Array
+ * </td>
+ * <td>
+ * A natural representation for vector or tensor data
+ * </td>
+ * <td>
+ * Cannot access elements separately (no access by plane)
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * An array datatype may be multi-dimensional with 1 to #H5S_MAX_RANK(the maximum rank
+ * of a dataset is currently 32) dimensions. The dimensions can be any size greater than 0, but
+ * unlimited dimensions are not supported (although the datatype can be a variable-length datatype).
+ *
+ * An array datatype is created with the #H5Tarray_create call, which specifies the number of
+ * dimensions, the size of each dimension, and the base type of the array. The array datatype can
+ * then be used in any way that any datatype object is used. The example below shows the creation
+ * of a datatype that is a two-dimensional array of native integers, and this is then used to create a
+ * dataset. Note that the dataset can be a dataspace that is any number and size of dimensions. The figure
+ * below shows the layout in memory assuming that the native integers are 4 bytes. Each
+ * data element has 6 elements, for a total of 24 bytes.
+ *
+ * <em>Create a two-dimensional array datatype</em>
+ * \code
+ * hid_t file, dataset;
+ * hid_t datatype, dataspace;
+ * hsize_t adims[] = {3, 2};
+ *
+ * datatype = H5Tarray_create(H5T_NATIVE_INT, 2, adims, NULL);
+ *
+ * dataset = H5Dcreate(file, datasetname, datatype,
+ * dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig14.gif "Memory layout of a two-dimensional array datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * @anchor h4_vlen_datatype <h4>Variable-length Datatypes</h4>
+ *
+ * A variable-length (VL) datatype is a one-dimensional sequence of a datatype which are not fixed
+ * in length from one dataset location to another. In other words, each data element may have a
+ * different number of members. Variable-length datatypes cannot be divided;the entire data
+ * element must be transferred.
+ *
+ * VL datatypes are useful to the scientific community in many different ways, possibly including:
+ * <ul>
+ * <li>Ragged arrays: Multi-dimensional ragged arrays can be implemented with the last (fastest changing)
+ * dimension being ragged by using a VL datatype as the type of the element stored.
+ * </li>
+ * <li>Fractal arrays: A nested VL datatype can be used to implement ragged arrays of ragged arrays, to
+ * whatever nesting depth is required for the user.
+ * </li>
+ * <li>Polygon lists: A common storage requirement is to efficiently store arrays of polygons with
+ * different numbers of vertices. A VL datatype can be used to efficiently and succinctly describe
+ * an array of polygons with different numbers of vertices.
+ * </li>
+ * <li>Character strings: Perhaps the most common use of VL datatypes will be to store C-like VL
+ * character strings in dataset elements or as attributes of objects.
+ * </li>
+ * <li>Indices (for example, of objects within a file): An array of VL object references could be used
+ * as an index to all the objects in a file which contain a particular sequence of dataset values.
+ * </li>
+ * <li>Object Tracking: An array of VL dataset region references can be used as a method of tracking
+ * objects or features appearing in a sequence of datasets.
+ * </li>
+ * </ul>
+ *
+ * A VL datatype is created by calling #H5Tvlen_create which specifies the base datatype. The first
+ * example below shows an example of code that creates a VL datatype of unsigned integers. Each
+ * data element is a one-dimensional array of zero or more members and is stored in the
+ * hvl_t structure. See the second example below.
+ *
+ * <em>Create a variable-length datatype of unsigned integers</em>
+ * \code
+ * tid1 = H5Tvlen_create (H5T_NATIVE_UINT);
+ *
+ * dataset=H5Dcreate(fid1,“Dataset1”, tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * <em>Data element storage for members of the VL datatype</em>
+ * \code
+ * typedef struct
+ * {
+ * size_t len; // Length of VL data
+ * //(in base type units)
+ * void *p; // Pointer to VL data
+ * } hvl_t;
+ * \endcode
+ *
+ * The first example below shows how the VL data is written. For each of the 10 data elements, a
+ * length and data buffer must be allocated. Below the two examples is a figure that shows how the
+ * data is laid out in memory.
+ *
+ * An analogous procedure must be used to read the data. See the second example below. An
+ * appropriate array of vl_t must be allocated, and the data read. It is then traversed one data
+ * element at a time. The #H5Dvlen_reclaim call frees the data buffer for the buffer. With each
+ * element possibly being of different sequence lengths for a dataset with a VL datatype, the
+ * memory for the VL datatype must be dynamically allocated. Currently there are two methods of
+ * managing the memory for VL datatypes: the standard C malloc/free memory allocation routines
+ * or a method of calling user-defined memory management routines to allocate or free memory
+ * (set with #H5Pset_vlen_mem_manager). Since the memory allocated when reading (or writing)
+ * may be complicated to release, the #H5Dvlen_reclaim function is provided to traverse a memory
+ * buffer and free the VL datatype information without leaking memory.
+ *
+ * <em>Write VL data</em>
+ * \code
+ * hvl_t wdata[10]; // Information to write
+ *
+ * // Allocate and initialize VL data to write
+ * for(i = 0; i < 10; i++) {
+ * wdata[i].p = malloc((i + 1) * sizeof(unsigned int));
+ * wdata[i].len = i + 1;
+ * for(j = 0; j < (i + 1); j++)
+ * ((unsigned int *)wdata[i].p)[j]=i * 10 + j;
+ * }
+ * ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
+ * \endcode
+ *
+ * <em>Read VL data</em>
+ * \code
+ * hvl_t rdata[SPACE1_DIM1];
+ * ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata);
+ *
+ * for(i = 0; i < SPACE1_DIM1; i++) {
+ * printf(“%d: len %d ”,rdata[i].len);
+ * for(j = 0; j < rdata[i].len; j++) {
+ * printf(“ value: %u\n”,((unsigned int *)rdata[i].p)[j]);
+ * }
+ * }
+ * ret = H5Dvlen_reclaim(tid1, sid1, xfer_pid, rdata);
+ * \endcode
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig15.gif "Memory layout of a VL datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The user program must carefully manage these relatively complex data structures. The
+ * #H5Dvlen_reclaim function performs a standard traversal, freeing all the data. This function
+ * analyzes the datatype and dataspace objects, and visits each VL data element, recursing through
+ * nested types. By default, the system free is called for the pointer in each vl_t. Obviously, this
+ * call assumes that all of this memory was allocated with the system malloc.
+ *
+ * The user program may specify custom memory manager routines, one for allocating and one for
+ * freeing. These may be set with the #H5Pset_vlen_mem_manager, and must have the following
+ * prototypes:
+ * <ul>
+ * <li>
+ * \code
+ * typedef void *(*H5MM_allocate_t)(size_t size, void *info);
+ * \endcode
+ * </li>
+ * <li>
+ * \code
+ * typedef void (*H5MM_free_t)(void *mem, void *free_info);
+ * \endcode
+ * </li>
+ * </ul>
+ * The utility function #H5Dvlen_get_buf_size checks the number of bytes required to store the VL
+ * data from the dataset. This function analyzes the datatype and dataspace object to visit all the VL
+ * data elements, to determine the number of bytes required to store the data for the in the
+ * destination storage (memory). The size value is adjusted for data conversion and alignment in the
+ * destination.
+ *
+ * \subsection subsec_datatype_other Other Non-numeric Datatypes
+ * Several datatype classes define special types of objects.
+ *
+ * \subsubsection subsubsec_datatype_other_strings Strings
+ * Text data is represented by arrays of characters, called strings. Many programming languages
+ * support different conventions for storing strings, which may be fixed or variable-length, and may
+ * have different rules for padding unused storage. HDF5 can represent strings in several ways. See
+ * the figure below.
+ *
+ * The strings to store are “Four score” and “lazy programmers.”
+ * <table>
+ * <caption>A string stored as one-character elements in a one-dimensional array</caption>
+ * <tr>
+ * <td>
+ * a) #H5T_NATIVE_CHAR: The dataset is a one-dimensional array with 29 elements, and each element
+ * is a single character.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig16a.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * b) Fixed-length string: The dataset is a one-dimensional array with two elements, and each
+ * element is 20 characters.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig16b.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * c) Variable-length string: The dataset is a one-dimensional array with two elements, and each
+ * element is a variable-length string. This is the same result when stored as a fixed-length
+ * string except that the first element of the array will need only 11 bytes for storage instead of 20.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig16c.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig16d.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * First, a dataset may have a dataset with datatype #H5T_NATIVE_CHAR with each character of
+ * the string as an element of the dataset. This will store an unstructured block of text data, but
+ * gives little indication of any structure in the text. See item a in the figure above.
+ *
+ * A second alternative is to store the data using the datatype class #H5T_STRING with each
+ * element a fixed length. See item b in the figure above. In this approach, each element might be a
+ * word or a sentence, addressed by the dataspace. The dataset reserves space for the specified
+ * number of characters, although some strings may be shorter. This approach is simple and usually
+ * is fast to access, but can waste storage space if the length of the Strings varies.
+ *
+ * A third alternative is to use a variable-length datatype. See item c in the figure above. This can
+ * be done using the standard mechanisms described above. The program would use vl_t structures
+ * to write and read the data.
+ *
+ * A fourth alternative is to use a special feature of the string datatype class to set the size of the
+ * datatype to #H5T_VARIABLE. See item c in the figure above. The example below shows a
+ * declaration of a datatype of type #H5T_C_S1 which is set to #H5T_VARIABLE. The HDF5
+ * Library automatically translates between this and the vl_t structure. Note: the #H5T_VARIABLE
+ * size can only be used with string datatypes.
+ * <em>Set the string datatype size to H5T_VARIABLE</em>
+ * \code
+ * tid1 = H5Tcopy (H5T_C_S1);
+ * ret = H5Tset_size (tid1, H5T_VARIABLE);
+ * \endcode
+ *
+ * Variable-length strings can be read into C strings (in other words, pointers to zero terminated
+ * arrays of char). See the example below.
+ * <em>Read variable-length strings into C strings</em>
+ * \code
+ * char *rdata[SPACE1_DIM1];
+ *
+ * ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata);
+ *
+ * for(i = 0; i < SPACE1_DIM1; i++) {
+ * printf(“%d: len: %d, str is: %s\n”, i, strlen(rdata[i]), rdata[i]);
+ * }
+ *
+ * ret = H5Dvlen_reclaim(tid1, sid1, xfer_pid, rdata);
+ * \endcode
+ *
+ * \subsubsection subsubsec_datatype_other_refs Reference
+ * In HDF5, objects (groups, datasets, and committed datatypes) are usually accessed by name.
+ * There is another way to access stored objects - by reference. There are two reference datatypes:
+ * object reference and region reference. Object reference objects are created with #H5Rcreate and
+ * other calls (cross reference). These objects can be stored and retrieved in a dataset as elements
+ * with reference datatype. The first example below shows an example of code that creates
+ * references to four objects, and then writes the array of object references to a dataset. The second
+ * example below shows a dataset of datatype reference being read and one of the reference objects
+ * being dereferenced to obtain an object pointer.
+ *
+ * In order to store references to regions of a dataset, the datatype should be #H5T_STD_REF_DSETREG.
+ * Note that a data element must be either an object reference or a region reference: these are
+ * different types and cannot be mixed within a single array.
+ *
+ * A reference datatype cannot be divided for I/O: an element is read or written completely.
+ *
+ * <em>Create object references and write to a dataset</em>
+ * \code
+ * dataset= H5Dcreate (fid1, “Dataset3”, H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * // Create reference to dataset
+ * ret = H5Rcreate(&wbuf[0], fid1,“/Group1/Dataset1”, H5R_OBJECT, -1);
+ *
+ * // Create reference to dataset
+ * ret = H5Rcreate(&wbuf[1], fid1, “/Group1/Dataset2”, H5R_OBJECT, -1);
+ *
+ * // Create reference to group
+ * ret = H5Rcreate(&wbuf[2], fid1, “/Group1”, H5R_OBJECT, -1);
+ *
+ * // Create reference to committed datatype
+ * ret = H5Rcreate(&wbuf[3], fid1, “/Group1/Datatype1”, H5R_OBJECT, -1);
+ *
+ * // Write selection to disk
+ * ret=H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
+ * \endcode
+ *
+ * <em>Read a dataset with a reference datatype</em>
+ * \code
+ * rbuf = malloc(sizeof(hobj_ref_t)*SPACE1_DIM1);
+ *
+ * // Read selection from disk
+ * ret=H5Dread(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf);
+ *
+ * // Open dataset object
+ * dset2 = H5Rdereference(dataset, H5R_OBJECT, &rbuf[0]);
+ * \endcode
+ *
+ * \subsubsection subsubsec_datatype_other_enum ENUM
+ * The enum datatype implements a set of (name, value) pairs, similar to C/C++ enum. The values
+ * are currently limited to native integer datatypes. Each name can be the name of only one value,
+ * and each value can have only one name.
+ *
+ * The data elements of the ENUMERATION are stored according to the datatype. An example
+ * would be as an array of integers. The example below shows an example of how to create an
+ * enumeration with five elements. The elements map symbolic names to 2-byte integers. See the
+ * table below.
+ * <em>Create an enumeration with five elements</em>
+ * \code
+ * hid_t hdf_en_colors;
+ * short val;
+ *
+ * hdf_en_colors = H5Tcreate(H5T_ENUM, sizeof(short));
+ * H5Tenum_insert(hdf_en_colors, “RED”, (val=0, &val));
+ * H5Tenum_insert(hdf_en_colors, “GREEN”, (val=1, &val));
+ * H5Tenum_insert(hdf_en_colors, “BLUE”, (val=2, &val));
+ * H5Tenum_insert(hdf_en_colors, “WHITE”, (val=3, &val));
+ * H5Tenum_insert(hdf_en_colors, “BLACK”, (val=4, &val));
+ * H5Dcreate(fileid, datasetname, hdf_en_colors, spaceid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * <table>
+ * <caption>An enumeration with five elements</caption>
+ * <tr>
+ * <th>Name</th>
+ * <th>Value</th>
+ * </tr>
+ * <tr>
+ * <td>RED</td>
+ * <td>0</td>
+ * </tr>
+ * <tr>
+ * <td>GREEN</td>
+ * <td>1</td>
+ * </tr>
+ * <tr>
+ * <td>BLUE</td>
+ * <td>2</td>
+ * </tr>
+ * <tr>
+ * <td>WHITE</td>
+ * <td>3</td>
+ * </tr>
+ * <tr>
+ * <td>BLACK</td>
+ * <td>4</td>
+ * </tr>
+ * </table>
+ *
+ * The figure below shows how an array of eight values might be stored. Conceptually, the array is
+ * an array of symbolic names [BLACK, RED, WHITE, BLUE, ...] See item a in the figure below.
+ * These are stored as the values and are short integers. So, the first 2 bytes are the value associated
+ * with “BLACK”, which is the number 4, and so on. See item b in the figure below.
+ * <table>
+ * <caption>Storing an enum array</caption>
+ * <tr>
+ * <td>
+ * a) Logical data to be written - eight elements
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig17a.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * b) The storage layout. Total size of the array is 16 bytes, 2 bytes per element.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig17b.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The order that members are inserted into an enumeration type is unimportant; the important part
+ * is the associations between the symbol names and the values. Thus, two enumeration datatypes
+ * will be considered equal if and only if both types have the same symbol/value associations and
+ * both have equal underlying integer datatypes. Type equality is tested with the H5Tequal
+ * function.
+ *
+ * If a particular architecture type is required, a little-endian or big-endian datatype for example,
+ * use a native integer datatype as the ENUM base datatype and use #H5Tconvert on values as they
+ * are read from or written to a dataset.
+ *
+ * \subsubsection subsubsec_datatype_other_opaque Opaque
+ * In some cases, a user may have data objects that should be stored and retrieved as blobs with no
+ * attempt to interpret them. For example, an application might wish to store an array of encrypted
+ * certificates which are 100 bytes long.
+ *
+ * While an arbitrary block of data may always be stored as bytes, characters, integers, or whatever,
+ * this might mislead programs about the meaning of the data. The opaque datatype defines data
+ * elements which are uninterpreted by HDF5. The opaque data may be labeled with
+ * #H5Tset_tag with a string that might be used by an application. For example, the encrypted
+ * certificates might have a tag to indicate the encryption and the certificate standard.
+ *
+ * \subsubsection subsubsec_datatype_other_bitfield Bitfield
+ * Some data is represented as bits, where the number of bits is not an integral byte and the bits are
+ * not necessarily interpreted as a standard type. Some examples might include readings from
+ * machine registers (for example, switch positions), a cloud mask, or data structures with several
+ * small integers that should be store in a single byte.
+ *
+ * This data could be stored as integers, strings, or enumerations. However, these storage methods
+ * would likely result in considerable wasted space. For example, storing a cloud mask with one
+ * byte per value would use up to eight times the space of a packed array of bits.
+ *
+ * The HDF5 bitfield datatype class defines a data element that is a contiguous sequence of bits,
+ * which are stored on disk in a packed array. The programming model is the same as for unsigned
+ * integers: the datatype object is created by copying a predefined datatype, and then the precision,
+ * offset, and padding are set.
+ *
+ * While the use of the bitfield datatype will reduce storage space substantially, there will still be
+ * wasted space if the bitfield as a whole does not match the 1-, 2-, 4-, or 8-byte unit in which it is
+ * written. The remaining unused space can be removed by applying the N-bit filter to the dataset
+ * containing the bitfield data. For more information, see "Using the N-bit Filter."
+ *
+ * \subsection subsec_datatype_fill Fill Values
+ * The “fill value” for a dataset is the specification of the default value assigned to data elements
+ * that have not yet been written. In the case of a dataset with an atomic datatype, the fill value is a
+ * single value of the appropriate datatype, such as ‘0’ or ‘-1.0’. In the case of a dataset with a
+ * composite datatype, the fill value is a single data element of the appropriate type. For example,
+ * for an array or compound datatype, the fill value is a single data element with values for all the
+ * component elements of the array or compound datatype.
+ *
+ * The fill value is set (permanently) when the dataset is created. The fill value is set in the dataset
+ * creation properties in the #H5Dcreate call. Note that the #H5Dcreate call must also include the
+ * datatype of the dataset, and the value provided for the fill value will be interpreted as a single
+ * element of this datatype. The example below shows code which creates a dataset of integers with
+ * fill value -1. Any unwritten data elements will be set to -1.
+ *
+ * <em>Create a dataset with a fill value of -1</em>
+ * \code
+ * hid_t plist_id;
+ * int filler;
+ *
+ * filler = -1;
+ * plist_id = H5Pcreate(H5P_DATASET_CREATE);
+ * H5Pset_fill_value(plist_id, H5T_NATIVE_INT, &filler);
+ *
+ * // Create the dataset with fill value ‘-1’.
+ * dataset_id = H5Dcreate(file_id, “/dset”, H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, plist_id,
+ * H5P_DEFAULT);
+ * \endcode
+ *
+ * <em>Create a fill value for a compound datatype</em>
+ * \code
+ * typedef struct s1_t {
+ * int a;
+ * char b;
+ * double c;
+ * } s1_t;
+ * s1_t filler;
+ *
+ * s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
+ * H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
+ * H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
+ * H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
+ *
+ * filler.a = -1;
+ * filler.b = ‘*’;
+ * filler.c = -2.0;
+ * plist_id = H5Pcreate(H5P_DATASET_CREATE);
+ * H5Pset_fill_value(plist_id, s1_tid, &filler);
+ *
+ * // Create the dataset with fill value
+ * // (-1, ‘*’, -2.0).
+ * dataset = H5Dcreate(file, datasetname, s1_tid, space, H5P_DEFAULT, plist_id, H5P_DEFAULT);
+ * \endcode
+ *
+ * The code above shows how to create a fill value for a compound datatype. The procedure is the
+ * same as the previous example except the filler must be a structure with the correct fields. Each
+ * field is initialized to the desired fill value.
+ *
+ * The fill value for a dataset can be retrieved by reading the dataset creation properties of the
+ * dataset and then by reading the fill value with #H5Pget_fill_value. The data will be read into
+ * memory using the storage layout specified by the datatype. This transfer will convert data in the
+ * same way as #H5Dread. The example below shows how to get the fill value from the dataset
+ * created in the example "Create a dataset with a fill value of -1".
+ *
+ * <em>Retrieve a fill value</em>
+ * \code
+ * hid_t plist2;
+ * int filler;
+ *
+ * dataset_id = H5Dopen(file_id, “/dset”, H5P_DEFAULT);
+ * plist2 = H5Dget_create_plist(dataset_id);
+ *
+ * H5Pget_fill_value(plist2, H5T_NATIVE_INT, &filler);
+ *
+ * // filler has the fill value, ‘-1’
+ * \endcode
+ *
+ * A similar procedure is followed for any datatype. The example below shows how to read the fill
+ * value for the compound datatype created in an example above. Note that the program must pass
+ * an element large enough to hold a fill value of the datatype indicated by the argument to
+ * #H5Pget_fill_value. Also, the program must understand the datatype in order to interpret its
+ * components. This may be difficult to determine without knowledge of the application that
+ * created the dataset.
+ *
+ * <em>Read the fill value for a compound datatype</em>
+ * \code
+ * char *fillbuf;
+ * int sz;
+ *
+ * dataset = H5Dopen( file, DATASETNAME, H5P_DEFAULT);
+ *
+ * s1_tid = H5Dget_type(dataset);
+ *
+ * sz = H5Tget_size(s1_tid);
+ *
+ * fillbuf = (char *)malloc(sz);
+ *
+ * plist_id = H5Dget_create_plist(dataset);
+ *
+ * H5Pget_fill_value(plist_id, s1_tid, fillbuf);
+ *
+ * printf(“filler.a: %d\n”,((s1_t *) fillbuf)->a);
+ * printf(“filler.b: %c\n”,((s1_t *) fillbuf)->b);
+ * printf(“filler.c: %f\n”,((s1_t *) fillbuf)->c);
+ * \endcode
+ *
+ * \subsection subsec_datatype_complex Complex Combinations of Datatypes
+ * Several composite datatype classes define collections of other datatypes, including other
+ * composite datatypes. In general, a datatype can be nested to any depth, with any combination of
+ * datatypes.
+ *
+ * For example, a compound datatype can have members that are other compound datatypes, arrays,
+ * VL datatypes. An array can be an array of array, an array of compound, or an array of VL. And a
+ * VL datatype can be a variable-length array of compound, array, or VL datatypes.
+ *
+ * These complicated combinations of datatypes form a logical tree, with a single root datatype, and
+ * leaves which must be atomic datatypes (predefined or user-defined). The figure below shows an
+ * example of a logical tree describing a compound datatype constructed from different datatypes.
+ *
+ * Recall that the datatype is a description of the layout of storage. The complicated compound
+ * datatype is constructed from component datatypes, each of which describes the layout of part of
+ * the storage. Any datatype can be used as a component of a compound datatype, with the
+ * following restrictions:
+ * <ul><li>1. No byte can be part of more than one component datatype (in other words, the fields cannot
+ * overlap within the compound datatype)</li>
+ * <li>2. The total size of the components must be less than or equal to the total size of the compound
+ * datatype</li></ul>
+ * These restrictions are essentially the rules for C structures and similar record types familiar from
+ * programming languages. Multiple typing, such as a C union, is not allowed in HDF5 datatypes.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig18.gif "A compound datatype built with different datatypes"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_datatype_complex_create Creating a Complicated Compound Datatype
+ * To construct a complicated compound datatype, each component is constructed, and then added
+ * to the enclosing datatype description. The example below shows how to create a compound
+ * datatype with four members:
+ * \li “T1”, a compound datatype with three members
+ * \li “T2”, a compound datatype with two members
+ * \li “T3”, a one-dimensional array of integers
+ * \li “T4”, a string
+ *
+ * Below the example code is a figure that shows this datatype as a logical tree. The output of the
+ * h5dump utility is shown in the example below the figure.
+ *
+ * Each datatype is created as a separate datatype object. Figure "The storage layout for the
+ * four member datatypes" below shows the storage layout
+ * for the four individual datatypes. Then the datatypes are inserted into the outer datatype at an
+ * appropriate offset. Figure "The storage layout of the combined four members" below shows the
+ * resulting storage layout. The combined record is 89 bytes long.
+ *
+ * The Dataset is created using the combined compound datatype. The dataset is declared to be a 4
+ * by 3 array of compound data. Each data element is an instance of the 89-byte compound
+ * datatype. Figure "The layout of the dataset" below shows the layout of the dataset, and expands
+ * one of the elements to show the relative position of the component data elements.
+ *
+ * Each data element is a compound datatype, which can be written or read as a record, or each
+ * field may be read or written individually. The first field (“T1”) is itself a compound datatype
+ * with three fields (“T1.a”, “T1.b”, and “T1.c”). “T1” can be read or written as a record, or
+ * individual fields can be accessed. Similarly, the second filed is a compound datatype with two
+ * fields (“T2.f1”, “T2.f2”).
+ *
+ * The third field (“T3”) is an array datatype. Thus, “T3” should be accessed as an array of 40
+ * integers. Array data can only be read or written as a single element, so all 40 integers must be
+ * read or written to the third field. The fourth field (“T4”) is a single string of length 25.
+ *
+ * <em>Create a compound datatype with four members</em>
+ * \code
+ * typedef struct s1_t {
+ * int a;
+ * char b;
+ * double c;
+ * } s1_t;
+ * typedef struct s2_t {
+ * float f1;
+ * float f2;
+ * } s2_t;
+ * hid_t s1_tid, s2_tid, s3_tid, s4_tid, s5_tid;
+ *
+ * // Create a datatype for s1
+ * s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
+ * H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
+ * H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
+ * H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
+ *
+ * // Create a datatype for s2.
+ * s2_tid = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
+ * H5Tinsert(s2_tid, “f1”, HOFFSET(s2_t, f1), H5T_NATIVE_FLOAT);
+ * H5Tinsert(s2_tid, “f2”, HOFFSET(s2_t, f2), H5T_NATIVE_FLOAT);
+ *
+ * // Create a datatype for an Array of integers
+ * s3_tid = H5Tarray_create(H5T_NATIVE_INT, RANK, dim);
+ *
+ * // Create a datatype for a String of 25 characters
+ * s4_tid = H5Tcopy(H5T_C_S1);
+ * H5Tset_size(s4_tid, 25);
+ *
+ * // Create a compound datatype composed of one of each of these types.
+ * // The total size is the sum of the size of each.
+ * sz = H5Tget_size(s1_tid) + H5Tget_size(s2_tid) + H5Tget_size(s3_tid) + H5Tget_size(s4_tid);
+ * s5_tid = H5Tcreate (H5T_COMPOUND, sz);
+ *
+ * // Insert the component types at the appropriate offsets.
+ * H5Tinsert(s5_tid, “T1”, 0, s1_tid);
+ * H5Tinsert(s5_tid, “T2”, sizeof(s1_t), s2_tid);
+ * H5Tinsert(s5_tid, “T3”, sizeof(s1_t) + sizeof(s2_t), s3_tid);
+ * H5Tinsert(s5_tid, “T4”, (sizeof(s1_t) + sizeof(s2_t) + H5Tget_size(s3_tid)), s4_tid);
+ *
+ * // Create the dataset with this datatype.
+ * dataset = H5Dcreate(file, DATASETNAME, s5_tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig19.gif "Logical tree for the compound datatype with four members"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <em> Output from h5dump for the compound datatype</em>
+ * \code
+ * DATATYPE H5T_COMPOUND {
+ * H5T_COMPOUND {
+ * H5T_STD_I32LE “a_name”;
+ * H5T_STD_I8LE “b_name”;
+ * H5T_IEEE_F64LE “c_name”;
+ * } “T1”;
+ * H5T_COMPOUND {
+ * H5T_IEEE_F32LE “f1”;
+ * H5T_IEEE_F32LE “f2”;
+ * } “T2”;
+ * H5T_ARRAY { [10] H5T_STD_I32LE } “T3”;
+ * H5T_STRING {
+ * STRSIZE 25;
+ * STRPAD H5T_STR_NULLTERM;
+ * CSET H5T_CSET_ASCII;
+ * CTYPE H5T_C_S1;
+ * } “T4”;
+ * }
+ * \endcode
+ *
+ * <table>
+ * <caption> The storage layout for the four member datatypes</caption>
+ * <tr>
+ * <td>
+ * a) Compound type ‘s1_t’, size 16 bytes.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig20a.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * b) Compound type ‘s2_t’, size 8 bytes.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig20b.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * c) Array type ‘s3_tid’, 40 integers, total size 40 bytes.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig20c.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * d) String type ‘s4_tid’, size 25 bytes.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig20d.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig21.gif "The storage layout of the combined four members"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \li A 4 x 3 array of Compound Datatype
+ * \li Element [1,1] expanded
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig22.gif "The layout of the dataset"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsubsection subsubsec_datatype_complex_analyze Analyzing and Navigating a Compound Datatype
+ * A complicated compound datatype can be analyzed piece by piece to discover the exact storage
+ * layout. In the example above, the outer datatype is analyzed to discover that it is a compound
+ * datatype with four members. Each member is analyzed in turn to construct a complete map of the
+ * storage layout.
+ *
+ * The example below shows an example of code that partially analyzes a nested compound
+ * datatype. The name and overall offset and size of the component datatype is discovered, and then
+ * its type is analyzed depending on the datatype class. Through this method, the complete storage
+ * layout can be discovered.
+ *
+ * <em> Output from h5dump for the compound datatype</em>
+ * \code
+ * s1_tid = H5Dget_type(dataset);
+ *
+ * if (H5Tget_class(s1_tid) == H5T_COMPOUND) {
+ * printf(“COMPOUND DATATYPE {\n”);
+ * sz = H5Tget_size(s1_tid);
+ * nmemb = H5Tget_nmembers(s1_tid);
+ * printf(“ %d bytes\n”,sz);
+ * printf(“ %d members\n”,nmemb);
+ * for (i =0; i < nmemb; i++) {
+ * s2_tid = H5Tget_member_type(s1_tid, i);
+ * if (H5Tget_class(s2_tid) == H5T_COMPOUND) {
+ * // recursively analyze the nested type.
+ * }
+ * else if (H5Tget_class(s2_tid) == H5T_ARRAY) {
+ * sz2 = H5Tget_size(s2_tid);
+ * printf(“ %s: NESTED ARRAY DATATYPE offset %d size %d
+ * {\n”, H5Tget_member_name(s1_tid, i), H5Tget_member_offset(s1_tid, i), sz2);
+ * H5Tget_array_dims(s2_tid, dim);
+ * s3_tid = H5Tget_super(s2_tid);
+ * // Etc., analyze the base type of the array
+ * }
+ * else {
+ * // analyze a simple type
+ * printf(“ %s: type code %d offset %d size %d\n”, H5Tget_member_name(s1_tid, i),
+ * H5Tget_class(s2_tid), H5Tget_member_offset(s1_tid, i), H5Tget_size(s2_tid));
+ * }
+ * // and so on....
+ * \endcode
+ *
+ * \subsection subsec_datatype_life Life Cycle of the Datatype Object
+ * Application programs access HDF5 datatypes through identifiers. Identifiers are obtained by
+ * creating a new datatype or by copying or opening an existing datatype. The identifier can be used
+ * until it is closed or until the library shuts down. See items a and b in the figure below. By default,
+ * a datatype is transient, and it disappears when it is closed.
+ *
+ * When a dataset or attribute is created (#H5Dcreate or #H5Acreate), its datatype is stored in the
+ * HDF5 file as part of the dataset or attribute object. See item c in the figure below. Once an object
+ * created, its datatype cannot be changed or deleted. The datatype can be accessed by calling
+ * #H5Dget_type, #H5Aget_type, #H5Tget_super, or #H5Tget_member_type. See item d in the figure
+ * below. These calls return an identifier to a transient copy of the datatype of the dataset or
+ * attribute unless the datatype is a committed datatype.
+ * Note that when an object is created, the stored datatype is a copy of the transient datatype. If two
+ * objects are created with the same datatype, the information is stored in each object with the same
+ * effect as if two different datatypes were created and used.
+ *
+ * A transient datatype can be stored using #H5Tcommit in the HDF5 file as an independent, named
+ * object, called a committed datatype. Committed datatypes were formerly known as named
+ * datatypes. See item e in the figure below. Subsequently, when a committed datatype is opened
+ * with #H5Topen (item f), or is obtained with #H5Tget_member_type or similar call (item k), the return
+ * is an identifier to a transient copy of the stored datatype. The identifier can be used in the
+ * same way as other datatype identifiers except that the committed datatype cannot be modified. When a
+ * committed datatype is copied with #H5Tcopy, the return is a new, modifiable, transient datatype
+ * object (item f).
+ *
+ * When an object is created using a committed datatype (#H5Dcreate, #H5Acreate), the stored
+ * datatype is used without copying it to the object. See item j in the figure below. In this case, if
+ * multiple objects are created using the same committed datatype, they all share the exact same
+ * datatype object. This saves space and makes clear that the datatype is shared. Note that a
+ * committed datatype can be shared by objects within the same HDF5 file, but not by objects in
+ * other files. For more information on copying committed datatypes to other HDF5 files, see the
+ * “Copying Committed Datatypes with H5Ocopy” topic in the “Additional Resources” chapter.
+ *
+ * A committed datatype can be deleted from the file by calling #H5Ldelete which replaces
+ * #H5Gunlink. See item i in the figure below. If one or more objects are still using the datatype, the
+ * committed datatype cannot be accessed with #H5Topen, but will not be removed from the file
+ * until it is no longer used. #H5Tget_member_type and similar calls will return a transient copy of the
+ * datatype.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig23.gif "Life cycle of a datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Transient datatypes are initially modifiable. Note that when a datatype is copied or when it is
+ * written to the file (when an object is created) or the datatype is used to create a composite
+ * datatype, a copy of the current state of the datatype is used. If the datatype is then modified, the
+ * changes have no effect on datasets, attributes, or datatypes that have already been created. See
+ * the figure below.
+ *
+ * A transient datatype can be made read-only (#H5Tlock). Note that the datatype is still transient,
+ * and otherwise does not change. A datatype that is immutable is read-only but cannot be closed
+ * except when the entire library is closed. The predefined types such as #H5T_NATIVE_INT are
+ * immutable transient types.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig24.gif "Transient datatype states: modifiable, read-only, and immutable"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * To create two or more datasets that share a common datatype, first commit the datatype, and then
+ * use that datatype to create the datasets. See the example below.
+ * <em> Create a shareable datatype</em>
+ * \code
+ * hid_t t1 = ...some transient type...;
+ * H5Tcommit (file, “shared_type”, t1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * hid_t dset1 = H5Dcreate (file, “dset1”, t1, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * hid_t dset2 = H5Dcreate (file, “dset2”, t1, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * hid_t dset1 = H5Dopen (file, “dset1”, H5P_DEFAULT);
+ * hid_t t2 = H5Dget_type (dset1);
+ * hid_t dset3 = H5Dcreate (file, “dset3”, t2, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * hid_t dset4 = H5Dcreate (file, “dset4”, t2, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * <table>
+ * <caption> Datatype APIs</caption>
+ * <tr>
+ * <th>Function</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>
+ * \code
+ * hid_t H5Topen (hid_t location, const char *name)
+ * \endcode
+ * </td>
+ * <td>
+ * A committed datatype can be opened by calling this function, which returns a datatype identifier.
+ * The identifier should eventually be released by calling #H5Tclose() to release resources. The
+ * committed datatype returned by this function is read-only or a negative value is returned for failure.
+ * The location is either a file or group identifier.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \code
+ * herr_t H5Tcommit (hid_t location, const char *name, hid_t type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)
+ * \endcode
+ * </td>
+ * <td>
+ * A transient datatype (not immutable) can be written to a file and turned into a committed datatype by
+ * calling this function. The location is either a file or group identifier and when combined with name
+ * refers to a new committed datatype.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \code
+ * htri_t H5Tcommitted (hid_t type)
+ * \endcode
+ * </td>
+ * <td>
+ * A type can be queried to determine if it is a committed type or a transient type. If this function
+ * returns a positive value then the type is committed. Datasets which return committed datatypes with
+ * #H5Dget_type() are able to share the datatype with other datasets in the same file.
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_datatype_transfer Data Transfer: Datatype Conversion and Selection
+ * When data is transferred (write or read), the storage layout of the data elements may be different.
+ * For example, an integer might be stored on disk in big-endian byte order and read into memory
+ * with little-endian byte order. In this case, each data element will be transformed by the HDF5
+ * Library during the data transfer.
+ *
+ * The conversion of data elements is controlled by specifying the datatype of the source and
+ * specifying the intended datatype of the destination. The storage format on disk is the datatype
+ * specified when the dataset is created. The datatype of memory must be specified in the library
+ * call.
+ *
+ * In order to be convertible, the datatype of the source and destination must have the same
+ * datatype class (with the exception of enumeration type). Thus, integers can be converted to other
+ * integers, and floats to other floats, but integers cannot (yet) be converted to floats. For each
+ * atomic datatype class, the possible conversions are defined. An enumeration datatype can be
+ * converted to an integer or a floating-point number datatype.
+ *
+ * Basically, any datatype can be converted to another datatype of the same datatype class. The
+ * HDF5 Library automatically converts all properties. If the destination is too small to hold the
+ * source value then an overflow or underflow exception occurs. If a handler is defined with the
+ * #H5Pset_type_conv_cb function, it will be called. Otherwise, a default action will be performed.
+ * The table below summarizes the default actions.
+ *
+ * <table>
+ * <caption>Default actions for datatype conversion exceptions</caption>
+ * <tr>
+ * <th>Datatype Class</th>
+ * <th>Possible Exceptions</th>
+ * <th>Default Action</th>
+ * </tr>
+ * <tr>
+ * <td>Integer</td>
+ * <td>Size, offset, pad</td>
+ * <td></td>
+ * </tr>
+ * <tr>
+ * <td>Float</td>
+ * <td>Size, offset, pad, ebits</td>
+ * <td></td>
+ * </tr>
+ * <tr>
+ * <td>String</td>
+ * <td>Size</td>
+ * <td>Truncates, zero terminate if required.</td>
+ * </tr>
+ * <tr>
+ * <td>Enumeration</td>
+ * <td>No field</td>
+ * <td>All bits set</td>
+ * </tr>
+ * </table>
+ *
+ * For example, when reading data from a dataset, the source datatype is the datatype set when the
+ * dataset was created, and the destination datatype is the description of the storage layout in
+ * memory. The destination datatype must be specified in the #H5Dread call. The example below
+ * shows an example of reading a dataset of 32-bit integers. The figure below the example shows
+ * the data transformation that is performed.
+ * <em>Specify the destination datatype with H5Dread</em>
+ * \code
+ * // Stored as H5T_STD_BE32
+ * // Use the native memory order in the destination
+ * mem_type_id = H5Tcopy(H5T_NATIVE_INT);
+ * status = H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf);
+ * \endcode
+ *
+ * <table>
+ * <caption>Layout of a datatype conversion</caption>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig25a.gif<br />
+ * \image html Dtypes_fig25b.gif<br />
+ * \image html Dtypes_fig25c.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * One thing to note in the example above is the use of the predefined native datatype
+ * #H5T_NATIVE_INT. Recall that in this example, the data was stored as a 4-bytes in big-endian
+ * order. The application wants to read this data into an array of integers in memory. Depending on
+ * the system, the storage layout of memory might be either big or little-endian, so the data may
+ * need to be transformed on some platforms and not on others. The #H5T_NATIVE_INT type is set
+ * by the HDF5 Library to be the correct type to describe the storage layout of the memory on the
+ * system. Thus, the code in the example above will work correctly on any platform, performing a
+ * transformation when needed.
+ *
+ * There are predefined native types for most atomic datatypes, and these can be combined in
+ * composite datatypes. In general, the predefined native datatypes should always be used for data
+ * stored in memory.
+ * Predefined native datatypes describe the storage properties of memory.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig26.gif "An enum datatype conversion"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <em>Create an aligned and packed compound datatype</em>
+ * \code
+ * // Stored as H5T_STD_BE32
+ * // Use the native memory order in the destination
+ * mem_type_id = H5Tcopy(H5T_NATIVE_INT);
+ * status = H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf);
+ * \endcode
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig27.gif "Alignment of a compound datatype"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * <em>Transfer some fields of a compound datatype</em>
+ * \code
+ * // Stored as H5T_STD_BE32
+ * // Use the native memory order in the destination
+ * mem_type_id = H5Tcopy(H5T_NATIVE_INT);
+ * status = H5Dread(dataset_id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf);
+ * \endcode
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dtypes_fig28.gif "Layout when an element is skipped"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_datatype_text Text Descriptions of Datatypes: Conversion to and from
+ *
+ * HDF5 provides a means for generating a portable and human-readable text description of a
+ * datatype and for generating a datatype from such a text description. This capability is particularly
+ * useful for creating complex datatypes in a single step, for creating a text description of a datatype
+ * for debugging purposes, and for creating a portable datatype definition that can then be used to
+ * recreate the datatype on many platforms or in other applications.
+ *
+ * These tasks are handled by two functions provided in the HDF5 Lite high-level library:
+ * \li #H5LTtext_to_dtype Creates an HDF5 datatype in a single step.
+ * \li #H5LTdtype_to_text Translates an HDF5 datatype into a text description.
+ *
+ * Note that this functionality requires that the HDF5 High-Level Library (H5LT) be installed.
+ *
+ * While #H5LTtext_to_dtype can be used to generate any sort of datatype, it is particularly useful
+ * for complex datatypes.
+ *
+ * #H5LTdtype_to_text is most likely to be used in two sorts of situations: when a datatype must be
+ * closely examined for debugging purpose or to create a portable text description of the datatype
+ * that can then be used to recreate the datatype on other platforms or in other applications.
+ *
+ * These two functions work for all valid HDF5 datatypes except time, bitfield, and reference
+ * datatypes.
+ *
+ * The currently supported text format used by #H5LTtext_to_dtype and #H5LTdtype_to_text is the
+ * data description language (DDL) and conforms to the \ref DDLBNF110. The portion of the
+ * \ref DDLBNF110 that defines HDF5 datatypes appears below.
+ * <em>The definition of HDF5 datatypes from the HDF5 DDL</em>
+ * \code
+ * <datatype> ::= <atomic_type> | <compound_type> | <variable_length_type> | <array_type>
+ *
+ * <atomic_type> ::= <integer> | <float> | <time> | <string> |
+ * <bitfield> | <opaque> | <reference> | <enum>
+ * <integer> ::= H5T_STD_I8BE | H5T_STD_I8LE |
+ * H5T_STD_I16BE | H5T_STD_I16LE |
+ * H5T_STD_I32BE | H5T_STD_I32LE |
+ * H5T_STD_I64BE | H5T_STD_I64LE |
+ * H5T_STD_U8BE | H5T_STD_U8LE |
+ * H5T_STD_U16BE | H5T_STD_U16LE |
+ * H5T_STD_U32BE | H5T_STD_U32LE |
+ * H5T_STD_U64BE | H5T_STD_U64LE |
+ * 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
+ * <float> ::= H5T_IEEE_F32BE | H5T_IEEE_F32LE |
+ * H5T_IEEE_F64BE | H5T_IEEE_F64LE |
+ * H5T_NATIVE_FLOAT | H5T_NATIVE_DOUBLE |
+ * H5T_NATIVE_LDOUBLE
+ * <time> ::= H5T_TIME: not yet implemented
+ * <string> ::= H5T_STRING {
+ * STRSIZE <strsize> ;
+ * STRPAD <strpad> ;
+ * CSET <cset> ;
+ * CTYPE <ctype> ;
+ * }
+ * <strsize> ::= <int_value>
+ * <strpad> ::= H5T_STR_NULLTERM | H5T_STR_NULLPAD | H5T_STR_SPACEPAD
+ * <cset> ::= H5T_CSET_ASCII | H5T_CSET_UTF8
+ * <ctype> ::= H5T_C_S1 | H5T_FORTRAN_S1
+ *
+ * <bitfield> ::= H5T_STD_B8BE | H5T_STD_B8LE |
+ * H5T_STD_B16BE | H5T_STD_B16LE |
+ * H5T_STD_B32BE | H5T_STD_B32LE |
+ * H5T_STD_B64BE | H5T_STD_B64LE
+ *
+ * <opaque> ::= H5T_OPAQUE {
+ * OPAQUE_TAG <identifier>;
+ * OPAQUE_SIZE <int_value>;opt
+ * }
+ *
+ * <reference> ::= H5T_REFERENCE { <ref_type> }
+ * <ref_type> ::= H5T_STD_REF_OBJECT | H5T_STD_REF_DSETREG
+ *
+ * <compound_type> ::= H5T_COMPOUND {
+ * <member_type_def>+
+ * }
+ * <member_type_def> ::= <datatype> <field_name>;
+ * <field_name> ::= <identifier>
+ *
+ * <variable_length_type> ::= H5T_VLEN { <datatype> }
+ *
+ * <array_type> ::= H5T_ARRAY { <dim_sizes> <datatype> }
+ * <dim_sizes> ::= '['<dimsize>']' | '['<dimsize>']'<dim_sizes>
+ * <dimsize> ::= <int_value>
+ *
+ * <enum> ::= H5T_ENUM {
+ * <enum_base_type> <enum_def>+
+ * }
+ * <enum_base_type> ::= <integer>
+ * // Currently enums can only hold integer type data, but they may be expanded
+ * // in the future to hold any datatype
+ * <enum_def> ::= <enum_symbol> <enum_val>;
+ * <enum_symbol> ::= <identifier>
+ * <enum_val> ::= <int_value>
+ * \endcode
+ *
+ * <em> Old definitions of the opaque and compound datatypes</em>
+ * \code
+ * <opaque> ::= H5T_OPAQUE { <identifier> }
+ * <compound_type> ::= H5T_COMPOUND { <member_type_def>+ }
+ * <member_type_def> ::= <datatype> <field_name> ;
+ * <field_name> ::= <identifier>
+ * \endcode
+ *
+ * <h4>Examples</h4>
+ * The code sample below illustrates the use of #H5LTtext_to_dtype to generate a variable-length
+ * string datatype.
+ *
+ * <em>Creating a variable-length string datatype from a text description</em>
+ * \code
+ * hid_t dtype;
+ * if((dtype = H5LTtext_to_dtype(
+ * “H5T_STRING {
+ * STRSIZE H5T_VARIABLE;
+ * STRPAD H5T_STR_NULLPAD;
+ * CSET H5T_CSET_ASCII;
+ * CTYPE H5T_C_S1;
+ * }”, H5LT_DDL)) < 0)
+ * goto out;
+ * \endcode
+ *
+ * The code sample below illustrates the use of #H5LTtext_to_dtype to generate a complex array
+ * datatype.
+ *
+ * <em>Creating a complex array datatype from a text description</em>
+ * \code
+ * hid_t dtype;
+ * if((dtype = H5LTtext_to_dtype(
+ * “H5T_ARRAY { [5][7][13] H5T_ARRAY
+ * { [17][19] H5T_COMPOUND
+ * {
+ * H5T_STD_I8BE \“arr_compound_1\”;
+ * H5T_STD_I32BE \“arr_compound_2\”;
+ * }
+ * }
+ * }”, H5LT_DDL))<0)
+ * goto out;
+ * \endcode
+ *
+ * Previous Chapter \ref sec_dataset - Next Chapter \ref sec_dataspace
+ *
+ */
+
+/**
+ * \defgroup H5T Datatypes (H5T)
*
* Use the functions in this module to manage HDF5 datatypes.
*
diff --git a/src/H5VLmodule.h b/src/H5VLmodule.h
index 4ea4992..5e2e1b3 100644
--- a/src/H5VLmodule.h
+++ b/src/H5VLmodule.h
@@ -26,7 +26,97 @@
#define H5_MY_PKG H5VL
#define H5_MY_PKG_ERR H5E_VOL
-/**\defgroup H5VL H5VL
+/** \page H5VL_UG The HDF5 VOL plugin
+ *
+ * \section sec_vol The HDF5 VOL plugin
+ *
+ * \section subsec_vol_intro Introduction
+ * The virtual object layer is an abstraction layer in the HDF5 library that intercepts all API calls
+ * that could potentially access objects in an HDF5 container and forwards those calls to a VOL connector,
+ * which implements the storage. The user or application gets the benefit of using the familiar and
+ * widely-used HDF5 data model and API, but can map the physical storage of the HDF5 file and objects
+ * to storage that better meets the application's data needs.
+ *
+ * \section subsec_vol_abstract_layer The VOL Abstraction Layer
+ * The VOL lies just under the public API. When a storage-oriented public APIcall is made, the library
+ * performs a few sanity checks on the input parameters and then immediately invokes a VOL callback,
+ * which resolves to an implementation in the VOL connector that was selected when opening or creating
+ * the file. The VOL connector then performs whatever operations are needed before control returns to the
+ * library, where any final library operations such as assigning IDs for newly created/opened datasets are
+ * performed before returning. This means that, for calls that utilize the VOL, all of the functionality
+ * is deferred to the VOL connector and the HDF5 library does very little work. An important consideration
+ * of this is that most of the HDF5 caching layers (metadata and chunk caches, page buffering, etc.) will
+ * not be available as those are implemented in the HDF5 native VOL connector and cannot be easily reused
+ * by external connectors.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html vol_architecture.png "The VOL Architecture"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Not all public HDF5 API calls pass through the VOL. Only calls which require manipulating storage go
+ * through the VOL and require a VOL connector author to implement the appropriate callback. Dataspace,
+ * property list, error stack, etc. calls have nothing to do with storage manipulation or querying and
+ * do not use the VOL. This may be confusing when it comes to property list calls, since many of those
+ * calls set properties for storage. Property lists are just collections of key-value pairs, though, so
+ * a particular VOL connector is not required to set or get properties.
+ *
+ * Another thing to keep in mind is that not every VOL connector will implement the full HDF5 public API.
+ * In some cases, a particular feature like variable-length types may not have been developed yet or may
+ * not have an equivalent in the target storage system. Also, many HDF5 public API calls are specific to
+ * the native HDF5 file format and are unlikely to have any use in other VOL connectors. A
+ * feature/capabilities flag scheme is being developed to help navigate this.
+ *
+ * For more information about which calls go through the VOL and the mechanism by which this is implemented,
+ * see the connector author and library internals documentation.
+ *
+ * \section subsec_vol_connect VOL Connectors
+ * A VOL connector can be implemented in several ways:
+ * \li as a shared or static library linked to an application
+ * \li as a dynamically loaded plugin, implemented as a shared library
+ * \li and even as an internal connector, built into the HDF5 libraryitself
+ *
+ * This section mostly focuses on external connectors, both libraries and plugins, as those are expected
+ * to be much more common than internal implementations.
+ *
+ * A list of VOL connectors can be found here:
+ * <a href="https://portal.hdfgroup.org/display/support/Registered+VOL+Connectors">
+ * Registered VOL Connectors</a>
+ *
+ * This list is incomplete and only includes the VOL connectors that have been registered with
+ * The HDF Group.
+ *
+ * Not every connector in this collection is actively maintained by The HDF Group. It simply serves as a
+ * single location where important VOL connectors can be found. See the documentation in a connector's
+ * repository to determine its development status and the parties responsible for it.
+ *
+ * A VOL template that contains build scripts (Autotools and CMake) and an empty VOL connector "shell"
+ * which can be copied and used as a starting point for building new connectors is located here:
+ * <a href="https://github.com/HDFGroup/vol-template">VOL Connector Template</a>
+ *
+ * This template VOL connector is for use in constructing terminal VOL connectors that do not forward
+ * calls to an underlying connector. The external pass-through VOL connector listed on the registered
+ * connector page can be used as a starting point for pass-through connectors.
+ *
+ * The only current (non-test) internal VOL connector distributed with the library is the native file
+ * format connector (the "native VOL connector") which contains the code that handles native HDF5 (*.h5/hdf5)
+ * files. In other words, even the canonical HDF5 file format is implemented via the VOL, making it a core
+ * part of the HDF5 library and not an optional component which could be disabled.
+ *
+ * It has not been completely abstracted from the HDF5 library, though, and is treated as a special case.
+ * For example, it cannot be unloaded and is always present.
+ *
+ * \section subsec_vol_use Connector Use
+ *
+ * Previous Chapter \ref sec_plist - Next Chapter \ref sec_async
+ *
+ */
+
+/**
+ *\defgroup H5VL VOL connector (H5VL)
*
* \todo Describe the VOL plugin life cycle.
*
diff --git a/src/H5Zmodule.h b/src/H5Zmodule.h
index 338242e..ec21e50 100644
--- a/src/H5Zmodule.h
+++ b/src/H5Zmodule.h
@@ -28,7 +28,12 @@
#define H5_MY_PKG H5Z
#define H5_MY_PKG_ERR H5E_PLINE
-/**\defgroup H5Z H5Z
+/** \page H5Z_UG The HDF5 Filters
+ * @todo Under Construction
+ */
+
+/**
+ * \defgroup H5Z Filters (H5Z)
*
* Use the functions in this module to manage HDF5 filters.
*
diff --git a/src/H5module.h b/src/H5module.h
index 642683f..35de966 100644
--- a/src/H5module.h
+++ b/src/H5module.h
@@ -25,7 +25,1409 @@
#define H5_MY_PKG H5
#define H5_MY_PKG_ERR H5E_LIB
-/**\defgroup H5 H5
+/** \page H5DM_UG The HDF5 Data Model and File Structure
+ *
+ * \section sec_data_model The HDF5 Data Model and File Structure
+ * \subsection subsec_data_model_intro Introduction
+ * The Hierarchical Data Format (HDF) implements a model for managing and storing data. The
+ * model includes an abstract data model and an abstract storage model (the data format), and
+ * libraries to implement the abstract model and to map the storage model to different storage
+ * mechanisms. The HDF5 library provides a programming interface to a concrete implementation
+ * of the abstract models. The library also implements a model of data transfer, an efficient
+ * movement of data from one stored representation to another stored representation. The figure
+ * below illustrates the relationships between the models and implementations. This chapter
+ * explains these models in detail.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig1.gif "HDF5 models and implementations"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The <em>Abstract Data Model</em> is a conceptual model of data, data types, and data organization. The
+ * abstract data model is independent of storage medium or programming environment. The
+ * <em>Storage Model</em> is a standard representation for the objects of the abstract data model. The
+ * <a href="https://docs.hdfgroup.org/hdf5/develop/_s_p_e_c.html">HDF5 File Format Specification</a>
+ * defines the storage model.
+ *
+ * The <em>Programming Model</em> is a model of the computing environment and includes platforms from
+ * small single systems to large multiprocessors and clusters. The programming model manipulates
+ * (instantiates, populates, and retrieves) objects from the abstract data model.
+ *
+ * The <em>Library</em> is the concrete implementation of the programming model. The library exports the
+ * HDF5 APIs as its interface. In addition to implementing the objects of the abstract data model,
+ * the library manages data transfers from one stored form to another. Data transfer examples
+ * include reading from disk to memory and writing from memory to disk.
+ *
+ * <em>Stored Data</em> is the concrete implementation of the storage model. The <em>Storage Model</em>
+ * is mapped to several storage mechanisms including single disk files, multiple files (family of files),
+ * and memory representations.
+ *
+ * The HDF5 library is a C module that implements the programming model and abstract data
+ * model. The HDF5 library calls the operating system or other storage management software (for
+ * example, the MPI/IO Library) to store and retrieve persistent data. The HDF5 library may also
+ * link to other software such as filters for compression. The HDF5 library is linked to an
+ * application program which may be written in C, C++, Fortran, or Java. The application program
+ * implements problem specific algorithms and data structures and calls the HDF5 library to store
+ * and retrieve data. The figure below shows the dependencies of these modules.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig2.gif "The library, the application program, and other modules"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * It is important to realize that each of the software components manages data using models and
+ * data structures that are appropriate to the component. When data is passed between layers
+ * (during storage or retrieval), it is transformed from one representation to another. The figure
+ * below suggests some of the kinds of data structures used in the different layers.
+ *
+ * The <em>Application Program</em> uses data structures that represent the problem and algorithms
+ * including variables, tables, arrays, and meshes among other data structures. Depending on its
+ * design and function, an application may have quite a few different kinds of data structures and
+ * different numbers and sizes of objects.
+ *
+ * The <em>HDF5 Library</em> implements the objects of the HDF5 abstract data model. Some of these
+ * objects include groups, datasets, and attributes. The application program maps the application
+ * data structures to a hierarchy of HDF5 objects. Each application will create a mapping best
+ * suited to its purposes.
+ *
+ * The objects of the HDF5 abstract data model are mapped to the objects of the HDF5 storage
+ * model, and stored in a storage medium. The stored objects include header blocks, free lists, data
+ * blocks, B-trees, and other objects. Each group or dataset is stored as one or more header and data
+ * blocks.
+ * @see <a href="https://docs.hdfgroup.org/hdf5/develop/_s_p_e_c.html">HDF5 File Format Specification</a>
+ * for more information on how these objects are organized. The HDF5 library can also use other
+ * libraries and modules such as compression.
+ *
+ * <table>
+ * <caption>Data structures in different layers</caption>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig3_a.gif
+ * </td>
+ * <td>
+ * \image html Dmodel_fig2.gif
+ * </td>
+ * <td>
+ * \image html Dmodel_fig3_c.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * The important point to note is that there is not necessarily any simple correspondence between
+ * the objects of the application program, the abstract data model, and those of the Format
+ * Specification. The organization of the data of application program, and how it is mapped to the
+ * HDF5 abstract data model is up to the application developer. The application program only
+ * needs to deal with the library and the abstract data model. Most applications need not consider
+ * any details of the
+ * <a href="https://docs.hdfgroup.org/hdf5/develop/_s_p_e_c.html">HDF5 File Format Specification</a>
+ * or the details of how objects of abstract data model are translated to and from storage.
+ *
+ * \subsection subsec_data_model_abstract The Abstract Data Model
+ * The abstract data model (ADM) defines concepts for defining and describing complex data
+ * stored in files. The ADM is a very general model which is designed to conceptually cover many
+ * specific models. Many different kinds of data can be mapped to objects of the ADM, and
+ * therefore stored and retrieved using HDF5. The ADM is not, however, a model of any particular
+ * problem or application domain. Users need to map their data to the concepts of the ADM.
+ *
+ * The key concepts include:
+ * <ul><li>@ref subsubsec_data_model_abstract_file - a contiguous string of bytes in a computer
+ * store (memory, disk, etc.), and the bytes represent zero or more objects of the model</li>
+ * <li>@ref subsubsec_data_model_abstract_group - a collection of objects (including groups)</li>
+ * <li>@ref subsubsec_data_model_abstract_dataset - a multidimensional array of data elements with
+ * attributes and other metadata</li>
+ * <li>@ref subsubsec_data_model_abstract_space - a description of the dimensions of a multidimensional
+ * array</li>
+ * <li>@ref subsubsec_data_model_abstract_type - a description of a specific class of data element
+ * including its storage layout as a pattern of bits</li>
+ * <li>@ref subsubsec_data_model_abstract_attr - a named data value associated with a group,
+ * dataset, or named datatype</li>
+ * <li>@ref subsubsec_data_model_abstract_plist - a collection of parameters (some permanent and
+ * some transient) controlling options in the library</li>
+ * <li>@ref subsubsec_data_model_abstract_link - the way objects are connected</li></ul>
+ *
+ * These key concepts are described in more detail below.
+ *
+ * \subsubsection subsubsec_data_model_abstract_file File
+ * Abstractly, an HDF5 file is a container for an organized collection of objects. The objects are
+ * groups, datasets, and other objects as defined below. The objects are organized as a rooted,
+ * directed graph. Every HDF5 file has at least one object, the root group. See the figure below. All
+ * objects are members of the root group or descendants of the root group.
+ *
+ * <table>
+ * <caption>The HDF5 file</caption>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig4_b.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig4_a.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * HDF5 objects have a unique identity within a single HDF5 file and can be accessed only by their
+ * names within the hierarchy of the file. HDF5 objects in different files do not necessarily have
+ * unique identities, and it is not possible to access a permanent HDF5 object except through a file.
+ * For more information, see \ref subsec_data_model_structure.
+ *
+ * When the file is created, the file creation properties specify settings for the file. The file creation
+ * properties include version information and parameters of global data structures. When the file is
+ * opened, the file access properties specify settings for the current access to the file. File access
+ * properties include parameters for storage drivers and parameters for caching and garbage
+ * collection. The file creation properties are set permanently for the life of the file, and the file
+ * access properties can be changed by closing and reopening the file.
+ *
+ * An HDF5 file can be “mounted” as part of another HDF5 file. This is analogous to Unix file
+ * system mounts. The root of the mounted file is attached to a group in the mounting file, and all
+ * the contents can be accessed as if the mounted file were part of the mounting file.
+ *
+ * @see @ref sec_file.
+ *
+ * \subsubsection subsubsec_data_model_abstract_group Group
+ * An HDF5 group is analogous to a file system directory. Abstractly, a group contains zero or
+ * more objects, and every object must be a member of at least one group. The root group is a
+ * special case; it may not be a member of any group.
+ *
+ * Group membership is actually implemented via link objects. See the figure below. A link object
+ * is owned by a group and points to a named object. Each link has a name, and each link points to
+ * exactly one object. Each named object has at least one and possibly many links to it.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig5.gif "Group membership via link objects"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * There are three classes of named objects: group, dataset, and committed (named) datatype. See
+ * the figure below. Each of these objects is the member of at least one group, and this means there
+ * is at least one link to it.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig6.gif "Classes of named objects"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * @see @ref sec_group.
+ *
+ * \subsubsection subsubsec_data_model_abstract_dataset Dataset
+ * An HDF5 dataset is a multidimensional (rectangular) array of data elements. See the figure
+ * below. The shape of the array (number of dimensions, size of each dimension) is described by
+ * the dataspace object (described in the next section below).
+ *
+ * A data element is a single unit of data which may be a number, a character, an array of numbers
+ * or characters, or a record of heterogeneous data elements. A data element is a set of bits. The
+ * layout of the bits is described by the datatype (see below).
+ *
+ * The dataspace and datatype are set when the dataset is created, and they cannot be changed for
+ * the life of the dataset. The dataset creation properties are set when the dataset is created. The
+ * dataset creation properties include the fill value and storage properties such as chunking and
+ * compression. These properties cannot be changed after the dataset is created.
+ *
+ * The dataset object manages the storage and access to the data. While the data is conceptually a
+ * contiguous rectangular array, it is physically stored and transferred in different ways depending
+ * on the storage properties and the storage mechanism used. The actual storage may be a set of
+ * compressed chunks, and the access may be through different storage mechanisms and caches.
+ * The dataset maps between the conceptual array of elements and the actual stored data.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig7_b.gif "The dataset"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * @see @ref sec_dataset.
+ *
+ * \subsubsection subsubsec_data_model_abstract_space Dataspace
+ * The HDF5 dataspace describes the layout of the elements of a multidimensional array.
+ * Conceptually, the array is a hyper-rectangle with one to 32 dimensions. HDF5 dataspaces can be
+ * extendable. Therefore, each dimension has a current size and a maximum size, and the maximum
+ * may be unlimited. The dataspace describes this hyper-rectangle: it is a list of dimensions with
+ * the current and maximum (or unlimited) sizes. See the figure below.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig8.gif "The dataspace"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Dataspace objects are also used to describe hyperslab selections from a dataset. Any subset of the
+ * elements of a dataset can be selected for read or write by specifying a set of hyperslabs. A
+ * non-rectangular region can be selected by the union of several (rectangular) dataspaces.
+ *
+ * @see @ref sec_dataspace.
+ *
+ * \subsubsection subsubsec_data_model_abstract_type Datatype
+ * The HDF5 datatype object describes the layout of a single data element. A data element is a
+ * single element of the array; it may be a single number, a character, an array of numbers or
+ * carriers, or other data. The datatype object describes the storage layout of this data.
+ *
+ * Data types are categorized into 11 classes of datatype. Each class is interpreted according to a set
+ * of rules and has a specific set of properties to describe its storage. For instance, floating point
+ * numbers have exponent position and sizes which are interpreted according to appropriate
+ * standards for number representation. Thus, the datatype class tells what the element means, and
+ * the datatype describes how it is stored.
+ *
+ * The figure below shows the classification of datatypes. Atomic datatypes are indivisible. Each
+ * may be a single object such as a number or a string. Composite datatypes are composed of
+ * multiple elements of atomic datatypes. In addition to the standard types, users can define
+ * additional datatypes such as a 24-bit integer or a 16-bit float.
+ * A dataset or attribute has a single datatype object associated with it. See Figure 7 above. The
+ * datatype object may be used in the definition of several objects, but by default, a copy of the
+ * datatype object will be private to the dataset.
+ *
+ * Optionally, a datatype object can be stored in the HDF5 file. The datatype is linked into a group,
+ * and therefore given a name. A committed datatype (formerly called a named datatype) can be
+ * opened and used in any way that a datatype object can be used.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig9.gif "Datatype classifications"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * @see @ref sec_datatype.
+ *
+ * \subsubsection subsubsec_data_model_abstract_attr Attribute
+ * Any HDF5 named data object (group, dataset, or named datatype) may have zero or more user
+ * defined attributes. Attributes are used to document the object. The attributes of an object are
+ * stored with the object.
+ *
+ * An HDF5 attribute has a name and data. The data portion is similar in structure to a dataset: a
+ * dataspace defines the layout of an array of data elements, and a datatype defines the storage
+ * layout and interpretation of the elements See the figure below.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig10.gif "Attribute data elements"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * In fact, an attribute is very similar to a dataset with the following limitations:
+ * <ul><li>An attribute can only be accessed via the object</li>
+ * <li>Attribute names are significant only within the object</li>
+ * <li>An attribute should be a small object</li>
+ * <li>The data of an attribute must be read or written in a single access (partial reading or
+ * writing is not allowed)</li>
+ * <li>Attributes do not have attributes</li></ul>
+ *
+ * Note that the value of an attribute can be an object reference. A shared attribute or an attribute
+ * that is a large array can be implemented as a reference to a dataset.
+ *
+ * The name, dataspace, and datatype of an attribute are specified when it is created and cannot be
+ * changed over the life of the attribute. An attribute can be opened by name, by index, or by
+ * iterating through all the attributes of the object.
+ *
+ * @see @ref sec_attribute.
+ *
+ * \subsubsection subsubsec_data_model_abstract_plist Property List
+ * HDF5 has a generic property list object. Each list is a collection of name-value pairs. Each class
+ * of property list has a specific set of properties. Each property has an implicit name, a datatype,
+ * and a value. See the figure below. A property list object is created and used in ways similar to
+ * the other objects of the HDF5 library.
+ *
+ * Property Lists are attached to the object in the library, and they can be used by any part of the
+ * library. Some properties are permanent (for example, the chunking strategy for a dataset), others
+ * are transient (for example, buffer sizes for data transfer). A common use of a Property List is to
+ * pass parameters from the calling program to a VFL driver or a module of the pipeline.
+ *
+ * Property lists are conceptually similar to attributes. Property lists are information relevant to the
+ * behavior of the library while attributes are relevant to the user’s data and application.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig11_b.gif "The property list"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Property lists are used to control optional behavior for file creation, file access, dataset creation,
+ * dataset transfer (read, write), and file mounting. Some property list classes are shown in the table
+ * below. Details of the different property lists are explained in the relevant sections of this
+ * document.
+ *
+ * <table>
+ * <caption>Property list classes and their usage</caption>
+ * <tr>
+ * <th>Property List Class</th>
+ * <th>Used</th>
+ * <th>Examples</th>
+ * </tr>
+ * <tr>
+ * <td>#H5P_FILE_CREATE</td>
+ * <td>Properties for file creation.</td>
+ * <td>Set size of user block.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5P_FILE_ACCESS</td>
+ * <td>Properties for file access.</td>
+ * <td>Set parameters for VFL driver. An example is MPI I/O. </td>
+ * </tr>
+ * <tr>
+ * <td>#H5P_DATASET_CREATE</td>
+ * <td>Properties for dataset creation.</td>
+ * <td>Set chunking, compression, or fill value.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5P_DATASET_XFER</td>
+ * <td>Properties for raw data transfer (read and write).</td>
+ * <td>Tune buffer sizes or memory management.</td>
+ * </tr>
+ * <tr>
+ * <td>#H5P_FILE_MOUNT</td>
+ * <td>Properties for file mounting.</td>
+ * <td></td>
+ * </tr>
+ * </table>
+ *
+ * @see @ref sec_plist.
+ *
+ * \subsubsection subsubsec_data_model_abstract_link Link
+ * This section is under construction.
+ *
+ * \subsection subsec_data_model_storage The HDF5 Storage Model
+ * \subsubsection subsubsec_data_model_storage_spec The Abstract Storage Model: the HDF5 Format Specification
+ * The <a href="https://docs.hdfgroup.org/hdf5/develop/_s_p_e_c.html">HDF5 File Format Specification</a>
+ * defines how HDF5 objects and data are mapped to a linear
+ * address space. The address space is assumed to be a contiguous array of bytes stored on some
+ * random access medium. The format defines the standard for how the objects of the abstract data
+ * model are mapped to linear addresses. The stored representation is self-describing in the sense
+ * that the format defines all the information necessary to read and reconstruct the original objects
+ * of the abstract data model.
+ *
+ * The HDF5 File Format Specification is organized in three parts:
+ * <ul><li>Level 0: File signature and super block</li>
+ * <li>Level 1: File infrastructure</li>
+ * <ul><li>Level 1A: B-link trees and B-tree nodes</li>
+ * <li>Level 1B: Group</li>
+ * <li>Level 1C: Group entry</li>
+ * <li>Level 1D: Local heaps</li>
+ * <li>Level 1E: Global heap</li>
+ * <li>Level 1F: Free-space index</li></ul>
+ * <li>Level 2: Data object</li>
+ * <ul><li>Level 2A: Data object headers</li>
+ * <li>Level 2B: Shared data object headers</li>
+ * <li>Level 2C: Data object data storage</li></ul></ul>
+ *
+ * The Level 0 specification defines the header block for the file. Header block elements include a
+ * signature, version information, key parameters of the file layout (such as which VFL file drivers
+ * are needed), and pointers to the rest of the file. Level 1 defines the data structures used
+ * throughout the file: the B-trees, heaps, and groups. Level 2 defines the data structure for storing
+ * the data objects and data. In all cases, the data structures are completely specified so that every
+ * bit in the file can be faithfully interpreted.
+ *
+ * It is important to realize that the structures defined in the HDF5 file format are not the same as
+ * the abstract data model: the object headers, heaps, and B-trees of the file specification are not
+ * represented in the abstract data model. The format defines a number of objects for managing the
+ * storage including header blocks, B-trees, and heaps. The HDF5 File Format Specification defines
+ * how the abstract objects (for example, groups and datasets) are represented as headers, B-tree
+ * blocks, and other elements.
+ *
+ * The HDF5 library implements operations to write HDF5 objects to the linear format and to read
+ * from the linear format to create HDF5 objects. It is important to realize that a single HDF5
+ * abstract object is usually stored as several objects. A dataset, for example, might be stored in a
+ * header and in one or more data blocks, and these objects might not be contiguous on the hard
+ * disk.
+ *
+ * \subsubsection subsubsec_data_model_storage_imple Concrete Storage Model
+ * The HDF5 file format defines an abstract linear address space. This can be implemented in
+ * different storage media such as a single file or multiple files on disk or in memory. The HDF5
+ * Library defines an open interface called the Virtual File Layer (VFL). The VFL allows different
+ * concrete storage models to be selected.
+ *
+ * The VFL defines an abstract model, an API for random access storage, and an API to plug in
+ * alternative VFL driver modules. The model defines the operations that the VFL driver must and
+ * may support, and the plug-in API enables the HDF5 library to recognize the driver and pass it
+ * control and data.
+ *
+ * A number of VFL drivers have been defined in the HDF5 library. Some work with a single file,
+ * and some work with multiple files split in various ways. Some work in serial computing
+ * environments, and some work in parallel computing environments. Most work with disk copies
+ * of HDF5 files, but one works with a memory copy. These drivers are listed in the
+ * \ref table_file_drivers "Supported file drivers" table.
+ *
+ * @see @ref subsec_file_alternate_drivers.
+ *
+ * Each driver isolates the details of reading and writing storage so that the rest of the HDF5 library
+ * and user program can be almost the same for different storage methods. The exception to this
+ * rule is that some VFL drivers need information from the calling application. This information is
+ * passed using property lists. For example, the Parallel driver requires certain control information
+ * that must be provided by the application.
+ *
+ * \subsection subsec_data_model_structure The Structure of an HDF5 File
+ * \subsubsection subsubsec_data_model_structure_file Overall File Structure
+ * An HDF5 file is organized as a rooted, directed graph. Named data objects are the nodes of the
+ * graph, and links are the directed arcs. Each arc of the graph has a name, and the root group has
+ * the name “/”. Objects are created and then inserted into the graph with the link operation which
+ * creates a named link from a group to the object. For example, the figure below illustrates the
+ * structure of an HDF5 file when one dataset is created. An object can be the target of more than
+ * one link. The names on the links must be unique within each group, but there may be many links
+ * with the same name in different groups. Link names are unambiguous: some ancestor will have a
+ * different name, or they are the same object. The graph is navigated with path names similar to
+ * Unix file systems. An object can be opened with a full path starting at the root group or with a
+ * relative path and a starting node (group). Note that all paths are relative to a single HDF5 file. In
+ * this sense, an HDF5 file is analogous to a single Unix file system.
+ *
+ * <table>
+ * <caption>An HDF5 file with one dataset</caption>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig12_a.gif
+ * </td>
+ * <td>
+ * \image html Dmodel_fig12_b.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: In the figure above are two figures. The top figure represents a newly created file with one
+ * group, /. In the bottom figure, a dataset called /dset1 has been created.
+ *
+ * It is important to note that, just like the Unix file system, HDF5 objects do not have names. The
+ * names are associated with paths. An object has a unique (within the file) object identifier, but a
+ * single object may have many names because there may be many paths to the same object. An
+ * object can be renamed (moved to another group) by adding and deleting links. In this case, the
+ * object itself never moves. For that matter, membership in a group has no implication for the
+ * physical location of the stored object.
+ *
+ * Deleting a link to an object does not necessarily delete the object. The object remains available
+ * as long as there is at least one link to it. After all the links to an object are deleted, it can no
+ * longer be opened although the storage may or may not be reclaimed.
+ *
+ * It is important to realize that the linking mechanism can be used to construct very complex
+ * graphs of objects. For example, it is possible for an object to be shared between several groups
+ * and even to have more than one name in the same group. It is also possible for a group to be a
+ * member of itself or to be in a “cycle” in the graph. An example of a cycle is where a child is the
+ * parent of one of its own ancestors.
+ *
+ * \subsubsection subsubsec_data_model_structure_path HDF5 Path Names and Navigation
+ * The structure of the file constitutes the name space for the objects in the file. A path name is a
+ * string of components separated by ‘/’. Each component is the name of a link or the special
+ * character “.” for the current group. Link names (components) can be any string of ASCII
+ * characters not containing ‘/’ (except the string “.” which is reserved). However, users are advised
+ * to avoid the use of punctuation and non-printing characters because they may create problems for
+ * other software. The figure below gives a BNF grammar for HDF5 path names.
+ *
+ * <em>A BNF grammar for path names</em>
+ * \code
+ * PathName ::= AbsolutePathName | RelativePathName
+ * Separator ::= "/" ["/"]*
+ * AbsolutePathName ::= Separator [ RelativePathName ]
+ * RelativePathName ::= Component [ Separator RelativePathName ]*
+ * Component ::= "." | Name
+ * Name ::= Character+ - {"."}
+ * Character ::= {c: c in {{ legal ASCII characters } - {'/'}}
+ * \endcode
+ *
+ * An object can always be addressed by a full or absolute path which would start at the root group.
+ * As already noted, a given object can have more than one full path name. An object can also be
+ * addressed by a relative path which would start at a group and include the path to the object.
+ *
+ * The structure of an HDF5 file is “self-describing.” This means that it is possible to navigate the
+ * file to discover all the objects in the file. Basically, the structure is traversed as a graph starting at
+ * one node and recursively visiting the nodes of the graph.
+ *
+ * \subsubsection subsubsec_data_model_structure_example Examples of HDF5 File Structures
+ * The figures below show some possible HDF5 file structures with groups and datasets. The first
+ * figure shows the structure of a file with three groups. The second shows a dataset created in
+ * “/group1”. The third figure shows the structure after a dataset called dset2 has been added to the
+ * root group. The fourth figure shows the structure after another group and dataset have been
+ * added.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig14_a.gif "An HDF5 file structure with groups"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: The figure above shows three groups; /group1 and /group2 are members of the root group.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig14_b.gif "An HDF5 file structure with groups and a dataset"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: The figure above shows that a dataset has been created in /group1: /group1/dset1.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig14_c.gif " An HDF5 file structure with groups and datasets"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: In the figure above, another dataset has been added as a member of the root group: /dset2.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Dmodel_fig14_c.gif " Another HDF5 file structure with groups and datasets"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: In the figure above, another group and dataset have been added reusing object names:
+ * <em>/group2/group2/dset2</em>.
+ * <ol><li>HDF5 requires random access to the linear address space. For this reason it is not
+ * well suited for some data media such as streams.</li>
+ * <li>It could be said that HDF5 extends the organizing concepts of a file system to the internal
+ * structure of a single file.</li>
+ * <li>As of HDF5-1.4, the storage used for an object is reclaimed, even if all links are
+ * deleted.</li></ol>
+ *
+ * Next Chapter \ref sec_program
+ *
+ */
+
+/** \page H5_UG The HDF5 Library and Programming Model
+ *
+ * \section sec_program The HDF5 Library and Programming Model
+ * \subsection subsec_program_intro Introduction
+ * The HDF5 library implements the HDF5 abstract data model and storage model. These models
+ * were described in the preceding chapter.
+ *
+ * Two major objectives of the HDF5 products are to provide tools that can be used on as many
+ * computational platforms as possible (portability), and to provide a reasonably object-oriented
+ * data model and programming interface.
+ *
+ * To be as portable as possible, the HDF5 library is implemented in portable C. C is not an
+ * object-oriented language, but the library uses several mechanisms and conventions to implement an
+ * object model.
+ *
+ * One mechanism the HDF5 library uses is to implement the objects as data structures. To refer to
+ * an object, the HDF5 library implements its own pointers. These pointers are called identifiers.
+ * An identifier is then used to invoke operations on a specific instance of an object. For example,
+ * when a group is opened, the API returns a group identifier. This identifier is a reference to that
+ * specific group and will be used to invoke future operations on that group. The identifier is valid
+ * only within the context it is created and remains valid until it is closed or the file is closed. This
+ * mechanism is essentially the same as the mechanism that C++ or other object-oriented languages
+ * use to refer to objects except that the syntax is C.
+ *
+ * Similarly, object-oriented languages collect all the methods for an object in a single name space.
+ * An example is the methods of a C++ class. The C language does not have any such mechanism,
+ * but the HDF5 library simulates this through its API naming convention. API function names
+ * begin with a common prefix that is related to the class of objects that the function operates on.
+ * The table below lists the HDF5 objects and the standard prefixes used by the corresponding
+ * HDF5 APIs. For example, functions that operate on datatype objects all have names beginning
+ * with H5T.
+ *
+ * <table>
+ * <caption>Access flags and modes</caption>
+ * <tr>
+ * <th>Prefix</th>
+ * <th>Operates on</th>
+ * </tr>
+ * <tr>
+ * <td>@ref H5A</td>
+ * <td>Attributes</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5D</td>
+ * <td>Datasets</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5E</td>
+ * <td>Error reports</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5F</td>
+ * <td>Files</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5G</td>
+ * <td>Groups</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5I</td>
+ * <td>Identifiers</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5L</td>
+ * <td>Links</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5O</td>
+ * <td>Objects</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5P</td>
+ * <td>Property lists</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5R</td>
+ * <td>References</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5S</td>
+ * <td>Dataspaces</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5T</td>
+ * <td>Datatypes</td>
+ * </tr>
+ * <tr>
+ * <td>@ref H5Z</td>
+ * <td>Filters</td>
+ * </tr>
+ * </table>
+ *
+ * \subsection subsec_program_model The HDF5 Programming Model
+ * In this section we introduce the HDF5 programming model by means of a series of short code
+ * samples. These samples illustrate a broad selection of common HDF5 tasks. More details are
+ * provided in the following chapters and in the HDF5 Reference Manual.
+ *
+ * \subsubsection subsubsec_program_model_create Creating an HDF5 File
+ * Before an HDF5 file can be used or referred to in any manner, it must be explicitly created or
+ * opened. When the need for access to a file ends, the file must be closed. The example below
+ * provides a C code fragment illustrating these steps. In this example, the values for the file
+ * creation property list and the file access property list are set to the defaults #H5P_DEFAULT.
+ *
+ * <em>Creating and closing an HDF5 file</em>
+ * \code
+ * hid_t file; // declare file identifier
+ *
+ * // Create a new file using H5F_ACC_TRUNC to truncate and overwrite
+ * // any file of the same name, default file creation properties, and
+ * // default file access properties. Then close the file.
+ * file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ * status = H5Fclose(file);
+ * \endcode
+ *
+ * Note: If there is a possibility that a file of the declared name already exists and you wish to open
+ * a new file regardless of that possibility, the flag #H5F_ACC_TRUNC will cause the operation to
+ * overwrite the previous file. If the operation should fail in such a circumstance, use the flag
+ * #H5F_ACC_EXCL instead.
+ *
+ * \subsubsection subsubsec_program_model_dset Creating and Initializing a Dataset
+ * The essential objects within a dataset are datatype and dataspace. These are independent objects
+ * and are created separately from any dataset to which they may be attached. Hence, creating a
+ * dataset requires, at a minimum, the following steps:
+ * <ol><li>Create and initialize a dataspace for the dataset</li>
+ * <li>Define a datatype for the dataset</li>
+ * <li>Create and initialize the dataset</li></ol>
+ *
+ * The code in the example below illustrates the execution of these steps.
+ *
+ * <em>Create a dataset</em>
+ * \code
+ * hid_t dataset, datatype, dataspace; // declare identifiers
+ *
+ * // Create a dataspace: Describe the size of the array and
+ * // create the dataspace for a fixed-size dataset.
+ * dimsf[0] = NX;
+ * dimsf[1] = NY;
+ * dataspace = H5Screate_simple(RANK, dimsf, NULL);
+ *
+ * // Define a datatype for the data in the dataset.
+ * // We will store little endian integers.
+ * datatype = H5Tcopy(H5T_NATIVE_INT);
+ * status = H5Tset_order(datatype, H5T_ORDER_LE);
+ *
+ * // Create a new dataset within the file using the defined
+ * // dataspace and datatype and default dataset creation
+ * // properties.
+ * // NOTE: H5T_NATIVE_INT can be used as the datatype if
+ * // conversion to little endian is not needed.
+ * dataset = H5Dcreate(file, DATASETNAME, datatype, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * \subsubsection subsubsec_program_model_close Closing an Object
+ * An application should close an object such as a datatype, dataspace, or dataset once the object is
+ * no longer needed. Since each is an independent object, each must be released (or closed)
+ * separately. This action is frequently referred to as releasing the object’s identifier. The code in
+ * the example below closes the datatype, dataspace, and dataset that were created in the preceding
+ * section.
+ *
+ * <em>Close an object</em>
+ * \code
+ * H5Tclose(datatype);
+ * H5Dclose(dataset);
+ * H5Sclose(dataspace);
+ * \endcode
+ *
+ * There is a long list of HDF5 library items that return a unique identifier when the item is created
+ * or opened. Each time that one of these items is opened, a unique identifier is returned. Closing a
+ * file does not mean that the groups, datasets, or other open items are also closed. Each opened
+ * item must be closed separately.
+ *
+ * For more information,
+ * @see <a href="http://www.hdfgroup.org/HDF5/doc/Advanced/UsingIdentifiers/index.html">Using Identifiers</a>
+ * in the HDF5 Application Developer’s Guide under General Topics in HDF5.
+ *
+ * <h4>How Closing a File Effects Other Open Structural Elements</h4>
+ * Every structural element in an HDF5 file can be opened, and these elements can be opened more
+ * than once. Elements range in size from the entire file down to attributes. When an element is
+ * opened, the HDF5 library returns a unique identifier to the application. Every element that is
+ * opened must be closed. If an element was opened more than once, each identifier that was
+ * returned to the application must be closed. For example, if a dataset was opened twice, both
+ * dataset identifiers must be released (closed) before the dataset can be considered closed. Suppose
+ * an application has opened a file, a group in the file, and two datasets in the group. In order for
+ * the file to be totally closed, the file, group, and datasets must each be closed. Closing the file
+ * before the group or the datasets will not affect the state of the group or datasets: the group and
+ * datasets will still be open.
+ *
+ * There are several exceptions to the above general rule. One is when the #H5close function is used.
+ * #H5close causes a general shutdown of the library: all data is written to disk, all identifiers are
+ * closed, and all memory used by the library is cleaned up. Another exception occurs on parallel
+ * processing systems. Suppose on a parallel system an application has opened a file, a group in the
+ * file, and two datasets in the group. If the application uses the #H5Fclose function to close the file,
+ * the call will fail with an error. The open group and datasets must be closed before the file can be
+ * closed. A third exception is when the file access property list includes the property
+ * #H5F_CLOSE_STRONG. This property closes any open elements when the file is closed with
+ * #H5Fclose. For more information, see the #H5Pset_fclose_degree function in the HDF5 Reference
+ * Manual.
+ *
+ * \subsubsection subsubsec_program_model_data Writing or Reading a Dataset to or from a File
+ * Having created the dataset, the actual data can be written with a call to #H5Dwrite. See the
+ * example below.
+ *
+ * <em>Writing a dataset</em>
+ * \code
+ * // Write the data to the dataset using default transfer properties.
+ * status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+ * \endcode
+ *
+ * Note that the third and fourth #H5Dwrite parameters in the above example describe the
+ * dataspaces in memory and in the file, respectively. For now, these are both set to
+ * #H5S_ALL which indicates that the entire dataset is to be written. The selection of partial datasets
+ * and the use of differing dataspaces in memory and in storage will be discussed later in this
+ * chapter and in more detail elsewhere in this guide.
+ *
+ * Reading the dataset from storage is similar to writing the dataset to storage. To read an entire
+ * dataset, substitute #H5Dread for #H5Dwrite in the above example.
+ *
+ * \subsubsection subsubsec_program_model_partial Reading and Writing a Portion of a Dataset
+ * The previous section described writing or reading an entire dataset. HDF5 also supports access to
+ * portions of a dataset. These parts of datasets are known as selections.
+ *
+ * The simplest type of selection is a simple hyperslab. This is an n-dimensional rectangular sub-set
+ * of a dataset where n is equal to the dataset’s rank. Other available selections include a more
+ * complex hyperslab with user-defined stride and block size, a list of independent points, or the
+ * union of any of these.
+ *
+ * The figure below shows several sample selections.
+ *
+ * <table>
+ * <caption align=top>Dataset selections</caption>
+ * <tr>
+ * <td>
+ * \image html Pmodel_fig5_a.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Pmodel_fig5_b.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Pmodel_fig5_c.gif
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>
+ * \image html Pmodel_fig5_d.gif<br />
+ * \image html Pmodel_fig5_e.gif
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Note: In the figure above, selections can take the form of a simple hyperslab, a hyperslab with
+ * user-defined stride and block, a selection of points, or a union of any of these forms.
+ *
+ * Selections and hyperslabs are portions of a dataset. As described above, a simple hyperslab is a
+ * rectangular array of data elements with the same rank as the dataset’s dataspace. Thus, a simple
+ * hyperslab is a logically contiguous collection of points within the dataset.
+ *
+ * The more general case of a hyperslab can also be a regular pattern of points or blocks within the
+ * dataspace. Four parameters are required to describe a general hyperslab: the starting coordinates,
+ * the block size, the stride or space between blocks, and the number of blocks. These parameters
+ * are each expressed as a one-dimensional array with length equal to the rank of the dataspace and
+ * are described in the table below.
+ *
+ * <table>
+ * <caption></caption>
+ * <tr>
+ * <th>Parameter</th>
+ * <th>Definition</th>
+ * </tr>
+ * <tr>
+ * <td>start</td>
+ * <td>The coordinates of the starting location of the hyperslab in the dataset’s dataspace.</td>
+ * </tr>
+ * <tr>
+ * <td>block</td>
+ * <td>The size of each block to be selected from the dataspace. If the block parameter
+ * is set to NULL, the block size defaults to a single element in each dimension, as
+ * if the block array was set to all 1s (all ones). This will result in the selection of a
+ * uniformly spaced set of count points starting at start and on the interval defined
+ * by stride.</td>
+ * </tr>
+ * <tr>
+ * <td>stride</td>
+ * <td>The number of elements separating the starting point of each element or block to
+ * be selected. If the stride parameter is set to NULL, the stride size defaults to 1
+ * (one) in each dimension and no elements are skipped.</td>
+ * </tr>
+ * <tr>
+ * <td>count</td>
+ * <td>The number of elements or blocks to select along each dimension.</td>
+ * </tr>
+ * </table>
+ *
+ * <h4>Reading Data into a Differently Shaped Memory Block</h4>
+ * For maximum flexibility in user applications, a selection in storage can be mapped into a
+ * differently-shaped selection in memory. All that is required is that the two selections contain the
+ * same number of data elements. In this example, we will first define the selection to be read from
+ * the dataset in storage, and then we will define the selection as it will appear in application
+ * memory.
+ *
+ * Suppose we want to read a 3 x 4 hyperslab from a two-dimensional dataset in a file beginning at
+ * the dataset element <1,2>. The first task is to create the dataspace that describes the overall rank
+ * and dimensions of the dataset in the file and to specify the position and size of the in-file
+ * hyperslab that we are extracting from that dataset. See the code below.
+ *
+ * <em>Define the selection to be read from storage</em>
+ * \code
+ * // Define dataset dataspace in file.
+ * dataspace = H5Dget_space(dataset); // dataspace identifier
+ * rank = H5Sget_simple_extent_ndims(dataspace);
+ *
+ * status_n = H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
+ *
+ * // Define hyperslab in the dataset.
+ * offset[0] = 1;
+ * offset[1] = 2;
+ * count[0] = 3;
+ * count[1] = 4;
+ * status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, NULL, count, NULL);
+ * \endcode
+ *
+ * The next task is to define a dataspace in memory. Suppose that we have in memory a
+ * three-dimensional 7 x 7 x 3 array into which we wish to read the two-dimensional 3 x 4 hyperslab
+ * described above and that we want the memory selection to begin at the element <3,0,0> and
+ * reside in the plane of the first two dimensions of the array. Since the in-memory dataspace is
+ * three-dimensional, we have to describe the in-memory selection as three-dimensional. Since we
+ * are keeping the selection in the plane of the first two dimensions of the in-memory dataset, the
+ * in-memory selection will be a 3 x 4 x 1 array defined as <3,4,1>.
+ *
+ * Notice that we must describe two things: the dimensions of the in-memory array, and the size
+ * and position of the hyperslab that we wish to read in. The code below illustrates how this would
+ * be done.
+ *
+ * <em>Define the memory dataspace and selection</em>
+ * \code
+ * // Define memory dataspace.
+ * dimsm[0] = 7;
+ * dimsm[1] = 7;
+ * dimsm[2] = 3;
+ * memspace = H5Screate_simple(RANK_OUT,dimsm,NULL);
+ *
+ * // Define memory hyperslab.
+ * offset_out[0] = 3;
+ * offset_out[1] = 0;
+ * offset_out[2] = 0;
+ * count_out[0] = 3;
+ * count_out[1] = 4;
+ * count_out[2] = 1;
+ * status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, offset_out, NULL, count_out, NULL);
+ * \endcode
+ *
+ * The hyperslab defined in the code above has the following parameters: start=(3,0,0),
+ * count=(3,4,1), stride and block size are NULL.
+ *
+ * <h4>Writing Data into a Differently Shaped Disk Storage Block</h4>
+ * Now let’s consider the opposite process of writing a selection from memory to a selection in a
+ * dataset in a file. Suppose that the source dataspace in memory is a 50-element, one-dimensional
+ * array called vector and that the source selection is a 48-element simple hyperslab that starts at the
+ * second element of vector. See the figure below.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Pmodel_fig2.gif "A one-dimensional array"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * Further suppose that we wish to write this data to the file as a series of 3 x 2-element blocks in a
+ * two-dimensional dataset, skipping one row and one column between blocks. Since the source
+ * selection contains 48 data elements and each block in the destination selection contains 6 data
+ * elements, we must define the destination selection with 8 blocks. We will write 2 blocks in the
+ * first dimension and 4 in the second. The code below shows how to achieve this objective.
+ *
+ * <em>The destination selection</em>
+ * \code
+ * // Select the hyperslab for the dataset in the file, using
+ * // 3 x 2 blocks, a (4,3) stride, a (2,4) count, and starting
+ * // at the position (0,1).
+ * start[0] = 0; start[1] = 1;
+ * stride[0] = 4; stride[1] = 3;
+ * count[0] = 2; count[1] = 4;
+ * block[0] = 3; block[1] = 2;
+ * ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, start, stride, count, block);
+ *
+ * // Create dataspace for the first dataset.
+ * mid1 = H5Screate_simple(MSPACE1_RANK, dim1, NULL);
+ *
+ * // Select hyperslab.
+ * // We will use 48 elements of the vector buffer starting at the
+ * // second element. Selected elements are 1 2 3 . . . 48
+ * start[0] = 1;
+ * stride[0] = 1;
+ * count[0] = 48;
+ * block[0] = 1;
+ * ret = H5Sselect_hyperslab(mid1, H5S_SELECT_SET, start, stride, count, block);
+ *
+ * // Write selection from the vector buffer to the dataset in the file.
+ * ret = H5Dwrite(dataset, H5T_NATIVE_INT, mid1, fid, H5P_DEFAULT, vector);
+ * \endcode
+ *
+ * \subsubsection subsubsec_program_model_info Getting Information about a Dataset
+ * Although reading is analogous to writing, it is often first necessary to query a file to obtain
+ * information about the dataset to be read. For instance, we often need to determine the datatype
+ * associated with a dataset, or its dataspace (in other words, rank and dimensions). As illustrated in
+ * the code example below, there are several get routines for obtaining this information.
+ *
+ * <em>Routines to get dataset parameters</em>
+ * \code
+ * // Get datatype and dataspace identifiers,
+ * // then query datatype class, order, and size, and
+ * // then query dataspace rank and dimensions.
+ * datatype = H5Dget_type (dataset); // datatype identifier
+ * class = H5Tget_class (datatype);
+ * if (class == H5T_INTEGER)
+ * printf("Dataset has INTEGER type \n");
+ *
+ * order = H5Tget_order (datatype);
+ * if (order == H5T_ORDER_LE)
+ * printf("Little endian order \n");
+ *
+ * size = H5Tget_size (datatype);
+ * printf ("Size is %d \n", size);
+ *
+ * dataspace = H5Dget_space (dataset); // dataspace identifier
+ *
+ * // Find rank and retrieve current and maximum dimension sizes.
+ * rank = H5Sget_simple_extent_dims (dataspace, dims, max_dims);
+ * \endcode
+ *
+ * \subsubsection subsubsec_program_model_compound Creating and Defining Compound Datatypes
+ * A compound datatype is a collection of one or more data elements. Each element might be an
+ * atomic type, a small array, or another compound datatype.
+ *
+ * The provision for nested compound datatypes allows these structures to become quite complex.
+ * An HDF5 compound datatype has some similarities to a C struct or a Fortran common block.
+ * Though not originally designed with databases in mind, HDF5 compound datatypes are
+ * sometimes used in a way that is similar to a database record. Compound datatypes can become
+ * either a powerful tool or a complex and difficult-to-debug construct. Reasonable caution is
+ * advised.
+ *
+ * To create and use a compound datatype, you need to create a datatype with class compound
+ * (#H5T_COMPOUND) and specify the total size of the data element in bytes. A compound
+ * datatype consists of zero or more uniquely named members. Members can be defined in any
+ * order but must occupy non-overlapping regions within the datum. The table below lists the
+ * properties of compound datatype members.
+ *
+ * <table>
+ * <caption></caption>
+ * <tr>
+ * <th>Parameter</th>
+ * <th>Definition</th>
+ * </tr>
+ * <tr>
+ * <td>Index</td>
+ * <td>An index number between zero and N-1, where N is the number of
+ * members in the compound. The elements are indexed in the order of their
+ * location in the array of bytes.</td>
+ * </tr>
+ * <tr>
+ * <td>Name</td>
+ * <td>A string that must be unique within the members of the same datatype.</td>
+ * </tr>
+ * <tr>
+ * <td>Datatype</td>
+ * <td>An HDF5 datatype.</td>
+ * </tr>
+ * <tr>
+ * <td>Offset</td>
+ * <td>A fixed byte offset which defines the location of the first byte of that
+ * member in the compound datatype.</td>
+ * </tr>
+ * </table>
+ *
+ * Properties of the members of a compound datatype are defined when the member is added to the
+ * compound type. These properties cannot be modified later.
+ *
+ * <h4>Defining Compound Datatypes</h4>
+ * Compound datatypes must be built out of other datatypes. To do this, you first create an empty
+ * compound datatype and specify its total size. Members are then added to the compound datatype
+ * in any order.
+ *
+ * Each member must have a descriptive name. This is the key used to uniquely identify the
+ * member within the compound datatype. A member name in an HDF5 datatype does not
+ * necessarily have to be the same as the name of the corresponding member in the C struct in
+ * memory although this is often the case. You also do not need to define all the members of the C
+ * struct in the HDF5 compound datatype (or vice versa).
+ *
+ * Usually a C struct will be defined to hold a data point in memory, and the offsets of the members
+ * in memory will be the offsets of the struct members from the beginning of an instance of the
+ * struct. The library defines the macro that computes the offset of member m within a struct
+ * variable s:
+ * \code
+ * HOFFSET(s,m)
+ * \endcode
+ *
+ * The code below shows an example in which a compound datatype is created to describe complex
+ * numbers whose type is defined by the complex_t struct.
+ *
+ * <em>A compound datatype for complex numbers</em>
+ * \code
+ * Typedef struct {
+ * double re; //real part
+ * double im; //imaginary part
+ * } complex_t;
+ *
+ * complex_t tmp; //used only to compute offsets
+ * hid_t complex_id = H5Tcreate (H5T_COMPOUND, sizeof tmp);
+ * H5Tinsert (complex_id, "real", HOFFSET(tmp,re), H5T_NATIVE_DOUBLE);
+ * H5Tinsert (complex_id, "imaginary", HOFFSET(tmp,im), H5T_NATIVE_DOUBLE);
+ * \endcode
+ *
+ * \subsubsection subsubsec_program_model_extend Creating and Writing Extendable Datasets
+ * An extendable dataset is one whose dimensions can grow. One can define an HDF5 dataset to
+ * have certain initial dimensions with the capacity to later increase the size of any of the initial
+ * dimensions. For example, the figure below shows a 3 x 3 dataset (a) which is later extended to
+ * be a 10 x 3 dataset by adding 7 rows (b), and further extended to be a 10 x 5 dataset by adding
+ * two columns (c).
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Pmodel_fig3.gif "Extending a dataset"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * HDF5 requires the use of chunking when defining extendable datasets. Chunking makes it
+ * possible to extend datasets efficiently without having to reorganize contiguous storage
+ * excessively.
+ *
+ * To summarize, an extendable dataset requires two conditions:
+ * <ol><li>Define the dataspace of the dataset as unlimited in all dimensions that might eventually be
+ * extended</li>
+ * <li>Enable chunking in the dataset creation properties</li></ol>
+ *
+ * For example, suppose we wish to create a dataset similar to the one shown in the figure above.
+ * We want to start with a 3 x 3 dataset, and then later we will extend it. To do this, go through the
+ * steps below.
+ *
+ * First, declare the dataspace to have unlimited dimensions. See the code shown below. Note the
+ * use of the predefined constant #H5S_UNLIMITED to specify that a dimension is unlimited.
+ *
+ * <em>Declaring a dataspace with unlimited dimensions</em>
+ * \code
+ * // dataset dimensions at creation time
+ * hsize_t dims[2] = {3, 3};
+ * hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};
+ *
+ * // Create the data space with unlimited dimensions.
+ * dataspace = H5Screate_simple(RANK, dims, maxdims);
+ * \endcode
+ *
+ * Next, set the dataset creation property list to enable chunking. See the code below.
+ *
+ * <em>Enable chunking</em>
+ * \code
+ * hid_t cparms;
+ * hsize_t chunk_dims[2] ={2, 5};
+ *
+ * // Modify dataset creation properties to enable chunking.
+ * cparms = H5Pcreate (H5P_DATASET_CREATE);
+ * status = H5Pset_chunk(cparms, RANK, chunk_dims);
+ * \endcode
+ *
+ * The next step is to create the dataset. See the code below.
+ *
+ * <em>Create a dataset</em>
+ * \code
+ * // Create a new dataset within the file using cparms creation properties.
+ * dataset = H5Dcreate(file, DATASETNAME, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, cparms, H5P_DEFAULT);
+ * \endcode
+ *
+ * Finally, when the time comes to extend the size of the dataset, invoke #H5Dextend. Extending the
+ * dataset along the first dimension by seven rows leaves the dataset with new dimensions of
+ * <10,3>. See the code below.
+ *
+ * <em>Extend the dataset by seven rows</em>
+ * \code
+ * // Extend the dataset. Dataset becomes 10 x 3.
+ * dims[0] = dims[0] + 7;
+ * size[0] = dims[0];
+ * size[1] = dims[1];
+ *
+ * status = H5Dextend (dataset, size);
+ * \endcode
+ *
+ * \subsubsection subsubsec_program_model_group Creating and Working with Groups
+ * Groups provide a mechanism for organizing meaningful and extendable sets of datasets within
+ * an HDF5 file. The @ref H5G API provides several routines for working with groups.
+ *
+ * <h4>Creating a Group</h4>
+ * With no datatype, dataspace, or storage layout to define, creating a group is considerably simpler
+ * than creating a dataset. For example, the following code creates a group called Data in the root
+ * group of file.
+ *
+ * <em> Create a group</em>
+ * \code
+ * // Create a group in the file.
+ * grp = H5Gcreate(file, "/Data", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * A group may be created within another group by providing the absolute name of the group to the
+ * #H5Gcreate function or by specifying its location. For example, to create the group Data_new in
+ * the group Data, you might use the sequence of calls shown below.
+ *
+ * <em>Create a group within a group</em>
+ * \code
+ * // Create group "Data_new" in the group "Data" by specifying
+ * // absolute name of the group.
+ * grp_new = H5Gcreate(file, "/Data/Data_new", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * // or
+ *
+ * // Create group "Data_new" in the "Data" group.
+ * grp_new = H5Gcreate(grp, "Data_new", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ * \endcode
+ *
+ * This first parameter of #H5Gcreate is a location identifier. file in the first example specifies only
+ * the file. \em grp in the second example specifies a particular group in a particular file. Note that in
+ * this instance, the group identifier \em grp is used as the first parameter in the #H5Gcreate call so that
+ * the relative name of Data_new can be used.
+ *
+ * The third parameter of #H5Gcreate optionally specifies how much file space to reserve to store
+ * the names of objects that will be created in this group. If a non-positive value is supplied, the
+ * library provides a default size.
+ *
+ * Use #H5Gclose to close the group and release the group identifier.
+ *
+ * <h4>Creating a Dataset within a Group</h4>
+ * As with groups, a dataset can be created in a particular group by specifying either its absolute
+ * name in the file or its relative name with respect to that group. The next code excerpt uses the
+ * absolute name.
+ *
+ * <em>Create a dataset within a group using a relative name</em>
+ * \code
+ * // Create the dataset "Compressed_Data" in the group Data using
+ * // the absolute name. The dataset creation property list is
+ * // modified to use GZIP compression with the compression
+ * // effort set to 6. Note that compression can be used only when
+ * // the dataset is chunked.
+ * dims[0] = 1000;
+ * dims[1] = 20;
+ * cdims[0] = 20;
+ * cdims[1] = 20;
+ * dataspace = H5Screate_simple(RANK, dims, NULL);
+ *
+ * plist = H5Pcreate(H5P_DATASET_CREATE);
+ * H5Pset_chunk(plist, 2, cdims);
+ * H5Pset_deflate(plist, 6);
+ *
+ * dataset = H5Dcreate(file, "/Data/Compressed_Data", H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
+ * plist, H5P_DEFAULT);
+ * \endcode
+ *
+ * Alternatively, you can first obtain an identifier for the group in which the dataset is to be
+ * created, and then create the dataset with a relative name.
+ *
+ * <em>Create a dataset within a group using a relative name</em>
+ * \code
+ * // Open the group.
+ * grp = H5Gopen(file, "Data", H5P_DEFAULT);
+ *
+ * // Create the dataset "Compressed_Data" in the "Data" group
+ * // by providing a group identifier and a relative dataset
+ * // name as parameters to the H5Dcreate function.
+ * dataset = H5Dcreate(grp, "Compressed_Data", H5T_NATIVE_INT, dataspace, H5P_DEFAULT, plist, H5P_DEFAULT);
+ * \endcode
+ *
+ * <h4>Accessing an Object in a Group</h4>
+ * Any object in a group can be accessed by its absolute or relative name. The first code snippet
+ * below illustrates the use of the absolute name to access the dataset <em>Compressed_Data</em> in the
+ * group <em>Data</em> created in the examples above. The second code snippet illustrates the use of the
+ * relative name.
+ *
+ * <em>Accessing a group using its relative name</em>
+ * \code
+ * // Open the dataset "Compressed_Data" in the "Data" group.
+ * dataset = H5Dopen(file, "/Data/Compressed_Data", H5P_DEFAULT);
+ *
+ * // Open the group "data" in the file.
+ * grp = H5Gopen(file, "Data", H5P_DEFAULT);
+ *
+ * // Access the "Compressed_Data" dataset in the group.
+ * dataset = H5Dopen(grp, "Compressed_Data", H5P_DEFAULT);
+ * \endcode
+ *
+ * \subsubsection subsubsec_program_model_attr Working with Attributes
+ * An attribute is a small dataset that is attached to a normal dataset or group. Attributes share many
+ * of the characteristics of datasets, so the programming model for working with attributes is
+ * similar in many ways to the model for working with datasets. The primary differences are that an
+ * attribute must be attached to a dataset or a group and sub-setting operations cannot be performed
+ * on attributes.
+ *
+ * To create an attribute belonging to a particular dataset or group, first create a dataspace for the
+ * attribute with the call to #H5Screate, and then create the attribute using #H5Acreate. For example,
+ * the code shown below creates an attribute called “Integer attribute” that is a member of a dataset
+ * whose identifier is dataset. The attribute identifier is attr2. #H5Awrite then sets the value of the
+ * attribute of that of the integer variable point. #H5Aclose then releases the attribute identifier.
+ *
+ * <em>Create an attribute</em>
+ * \code
+ * int point = 1; // Value of the scalar attribute
+ *
+ * // Create scalar attribute.
+ * aid2 = H5Screate(H5S_SCALAR);
+ * attr2 = H5Acreate(dataset, "Integer attribute", H5T_NATIVE_INT, aid2, H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * // Write scalar attribute.
+ * ret = H5Awrite(attr2, H5T_NATIVE_INT, &point);
+ *
+ * // Close attribute dataspace.
+ * ret = H5Sclose(aid2);
+ *
+ * // Close attribute.
+ * ret = H5Aclose(attr2);
+ * \endcode
+ *
+ * <em>Read a known attribute</em>
+ * \code
+ * // Attach to the scalar attribute using attribute name, then
+ * // read and display its value.
+ * attr = H5Aopen_by_name(file_id, dataset_name, "Integer attribute", H5P_DEFAULT, H5P_DEFAULT);
+ * ret = H5Aread(attr, H5T_NATIVE_INT, &point_out);
+ * printf("The value of the attribute \"Integer attribute\" is %d \n", point_out);
+ * ret = H5Aclose(attr);
+ * \endcode
+ *
+ * To read a scalar attribute whose name and datatype are known, first open the attribute using
+ * #H5Aopen_by_name, and then use #H5Aread to get its value. For example, the code shown below
+ * reads a scalar attribute called “Integer attribute” whose datatype is a native integer and whose
+ * parent dataset has the identifier dataset.
+ *
+ * To read an attribute whose characteristics are not known, go through these steps. First, query the
+ * file to obtain information about the attribute such as its name, datatype, rank, and dimensions,
+ * and then read the attribute. The following code opens an attribute by its index value using
+ * #H5Aopen_by_idx, and then it reads in information about the datatype with #H5Aread.
+ *
+ * <em>Read an unknown attribute</em>
+ * \code
+ * // Attach to the string attribute using its index, then read and
+ * // display the value.
+ * attr = H5Aopen_by_idx(file_id, dataset_name, index_type, iter_order, 2, H5P_DEFAULT, H5P_DEFAULT);
+ *
+ * atype = H5Tcopy(H5T_C_S1);
+ * H5Tset_size(atype, 4);
+ *
+ * ret = H5Aread(attr, atype, string_out);
+ * printf("The value of the attribute with the index 2 is %s \n", string_out);
+ * \endcode
+ *
+ * In practice, if the characteristics of attributes are not known, the code involved in accessing and
+ * processing the attribute can be quite complex. For this reason, HDF5 includes a function called
+ * #H5Aiterate. This function applies a user-supplied function to each of a set of attributes. The
+ * user-supplied function can contain the code that interprets, accesses, and processes each attribute.
+ *
+ * \subsection subsec_program_transfer_pipeline The Data Transfer Pipeline
+ * The HDF5 library implements data transfers between different storage locations. At the lowest
+ * levels, the HDF5 Library reads and writes blocks of bytes to and from storage using calls to the
+ * virtual file layer (VFL) drivers. In addition to this, the HDF5 library manages caches of metadata
+ * and a data I/O pipeline. The data I/O pipeline applies compression to data blocks, transforms
+ * data elements, and implements selections.
+ *
+ * A substantial portion of the HDF5 library’s work is in transferring data from one environment or
+ * media to another. This most often involves a transfer between system memory and a storage
+ * medium. Data transfers are affected by compression, encryption, machine-dependent differences
+ * in numerical representation, and other features. So, the bit-by-bit arrangement of a given dataset
+ * is often substantially different in the two environments.
+ *
+ * Consider the representation on disk of a compressed and encrypted little-endian array as
+ * compared to the same array after it has been read from disk, decrypted, decompressed, and
+ * loaded into memory on a big-endian system. HDF5 performs all of the operations necessary to
+ * make that transition during the I/O process with many of the operations being handled by the
+ * VFL and the data transfer pipeline.
+ *
+ * The figure below provides a simplified view of a sample data transfer with four stages. Note that
+ * the modules are used only when needed. For example, if the data is not compressed, the
+ * compression stage is omitted.
+ *
+ * <table>
+ * <tr>
+ * <td>
+ * \image html Pmodel_fig6.gif "A data transfer from storage to memory"
+ * </td>
+ * </tr>
+ * </table>
+ *
+ * For a given I/O request, different combinations of actions may be performed by the pipeline. The
+ * library automatically sets up the pipeline and passes data through the processing steps. For
+ * example, for a read request (from disk to memory), the library must determine which logical
+ * blocks contain the requested data elements and fetch each block into the library’s cache. If the
+ * data needs to be decompressed, then the compression algorithm is applied to the block after it is
+ * read from disk. If the data is a selection, the selected elements are extracted from the data block
+ * after it is decompressed. If the data needs to be transformed (for example, byte swapped), then
+ * the data elements are transformed after decompression and selection.
+ *
+ * While an application must sometimes set up some elements of the pipeline, use of the pipeline is
+ * normally transparent to the user program. The library determines what must be done based on the
+ * metadata for the file, the object, and the specific request. An example of when an application
+ * might be required to set up some elements in the pipeline is if the application used a custom
+ * error-checking algorithm.
+ *
+ * In some cases, it is necessary to pass parameters to and from modules in the pipeline or among
+ * other parts of the library that are not directly called through the programming API. This is
+ * accomplished through the use of dataset transfer and data access property lists.
+ *
+ * The VFL provides an interface whereby user applications can add custom modules to the data
+ * transfer pipeline. For example, a custom compression algorithm can be used with the HDF5
+ * Library by linking an appropriate module into the pipeline through the VFL. This requires
+ * creating an appropriate wrapper for the compression module and registering it with the library
+ * with #H5Zregister. The algorithm can then be applied to a dataset with an #H5Pset_filter call which
+ * will add the algorithm to the selected dataset’s transfer property list.
+ *
+ * Previous Chapter \ref sec_data_model - Next Chapter \ref sec_file
+ *
+ */
+
+/**
+ * \defgroup H5 Library General (H5)
*
* Use the functions in this module to manage the life cycle of HDF5 library
* instances.