/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * 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 LICENSE 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.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 * This program shows the concept of "mounting files".
 * Program creates one file with group G in it, and another
 * file with dataset D. Then second file is mounted in the first one
 * under the "mounting point" G. Dataset D is accessed in the first file
 * under name /G/D and data is printed out.
 */

#include "hdf5.h"

#define FILENAME1 "mount1.h5"
#define FILENAME2 "mount2.h5"

#define RANK 2
#define NX   4
#define NY   5

int
main(void)
{

    hid_t fid1, fid2, gid; /* Files and group identifiers */
    hid_t did, tid, sid;   /* Dataset and datatype identifiers */

    herr_t  status;
    hsize_t dims[] = {NX, NY}; /* Dataset dimensions */

    int i, j;
    int bm[NX][NY], bm_out[NX][NY]; /* Data buffers */

    /*
     * Initialization of buffer matrix "bm"
     */
    for (i = 0; i < NX; i++)
        for (j = 0; j < NY; j++)
            bm[i][j] = i + j;

    /*
     * Create first file and a group in it.
     */
    fid1 = H5Fcreate(FILENAME1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    gid  = H5Gcreate2(fid1, "/G", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);

    /*
     * Close group and file
     */
    H5Gclose(gid);
    H5Fclose(fid1);

    /*
     * Create second file and dataset "D" in it.
     */
    fid2    = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
    dims[0] = NX;
    dims[1] = NY;
    sid     = H5Screate_simple(RANK, dims, NULL);
    did     = H5Dcreate2(fid2, "D", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);

    /*
     * Write data to the dataset.
     */
    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm);

    /*
     * Close all identifiers.
     */
    H5Sclose(sid);
    H5Dclose(did);
    H5Fclose(fid2);

    /*
     * Reopen both files
     */
    fid1 = H5Fopen(FILENAME1, H5F_ACC_RDONLY, H5P_DEFAULT);
    fid2 = H5Fopen(FILENAME2, H5F_ACC_RDONLY, H5P_DEFAULT);

    /*
     * Mount second file under G in the first file.
     */
    H5Fmount(fid1, "/G", fid2, H5P_DEFAULT);

    /*
     * Access dataset D in the first file under /G/D name.
     */
    did    = H5Dopen2(fid1, "/G/D", H5P_DEFAULT);
    tid    = H5Dget_type(did);
    status = H5Dread(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm_out);

    /*
     * Print out the data.
     */
    for (i = 0; i < NX; i++) {
        for (j = 0; j < NY; j++)
            printf("  %d", bm_out[i][j]);
        printf("\n");
    }

    /*
     * Close all identifiers
     */
    H5Tclose(tid);
    H5Dclose(did);

    /*
     * Unmounting second file
     */
    H5Funmount(fid1, "/G");

    /*
     * Close both files
     */
    H5Fclose(fid1);
    H5Fclose(fid2);

    return 0;
}
