diff options
Diffstat (limited to 'HDF5Examples/C/H5G/h5ex_g_corder.c')
-rw-r--r-- | HDF5Examples/C/H5G/h5ex_g_corder.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/HDF5Examples/C/H5G/h5ex_g_corder.c b/HDF5Examples/C/H5G/h5ex_g_corder.c new file mode 100644 index 0000000..aa7a1af --- /dev/null +++ b/HDF5Examples/C/H5G/h5ex_g_corder.c @@ -0,0 +1,130 @@ +/************************************************************ + + This example shows how to track links in a group by + creation order. The program creates a series of groups, + then reads back their names: first in alphabetical order, + then in creation order. + + This file is intended for use with HDF5 Library version 1.8 + + ************************************************************/ + +#include "hdf5.h" +#include <stdio.h> +#include <stdlib.h> + +#define FILE "h5ex_g_corder.h5" + +int +main(void) +{ + hid_t file = H5I_INVALID_HID; + hid_t group = H5I_INVALID_HID; + hid_t subgroup = H5I_INVALID_HID; + hid_t gcpl = H5I_INVALID_HID; + herr_t status; + H5G_info_t ginfo; + ssize_t size; /* Size of name */ + hsize_t i; /* Index */ + char *name = NULL; /* Output buffer */ + + /* + * Create a new file using the default properties. + */ + file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create group creation property list and enable link creation + * order tracking. Attempting to track by creation order in a + * group that does not have this property set will result in an + * error. + */ + gcpl = H5Pcreate(H5P_GROUP_CREATE); + status = H5Pset_link_creation_order(gcpl, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED); + + /* + * Create primary group using the property list. + */ + group = H5Gcreate(file, "index_group", H5P_DEFAULT, gcpl, H5P_DEFAULT); + + /* + * Create subgroups in the primary group. These will be tracked + * by creation order. Note that these groups do not have to have + * the creation order tracking property set. + */ + subgroup = H5Gcreate(group, "H", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Gclose(subgroup); + subgroup = H5Gcreate(group, "D", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Gclose(subgroup); + subgroup = H5Gcreate(group, "F", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Gclose(subgroup); + subgroup = H5Gcreate(group, "5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Gclose(subgroup); + + /* + * Get group info. + */ + status = H5Gget_info(group, &ginfo); + + /* + * Traverse links in the primary group using alphabetical indices + * (H5_INDEX_NAME). + */ + printf("Traversing group using alphabetical indices:\n\n"); + for (i = 0; i < ginfo.nlinks; i++) { + + /* + * Get size of name, add 1 for null terminator. + */ + size = 1 + H5Lget_name_by_idx(group, ".", H5_INDEX_NAME, H5_ITER_INC, i, NULL, 0, H5P_DEFAULT); + + /* + * Allocate storage for name. + */ + name = (char *)malloc(size); + + /* + * Retrieve name, print it, and free the previously allocated + * space. + */ + size = H5Lget_name_by_idx(group, ".", H5_INDEX_NAME, H5_ITER_INC, i, name, (size_t)size, H5P_DEFAULT); + printf("Index %d: %s\n", (int)i, name); + free(name); + } + + /* + * Traverse links in the primary group by creation order + * (H5_INDEX_CRT_ORDER). + */ + printf("\nTraversing group using creation order indices:\n\n"); + for (i = 0; i < ginfo.nlinks; i++) { + + /* + * Get size of name, add 1 for null terminator. + */ + size = 1 + H5Lget_name_by_idx(group, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i, NULL, 0, H5P_DEFAULT); + + /* + * Allocate storage for name. + */ + name = (char *)malloc(size); + + /* + * Retrieve name, print it, and free the previously allocated + * space. + */ + size = H5Lget_name_by_idx(group, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, i, name, (size_t)size, + H5P_DEFAULT); + printf("Index %d: %s\n", (int)i, name); + free(name); + } + + /* + * Close and release resources. + */ + status = H5Pclose(gcpl); + status = H5Gclose(group); + status = H5Fclose(file); + + return 0; +} |