/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 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 files contains C stubs for H5D Fortran APIs */

#include "H5DSprivate.h"
#include "H5LTf90proto.h"
#include "H5Eprivate.h"

/*-------------------------------------------------------------------------
 * Function: h5dsset_scale_c
 *
 * Purpose: Calls H5DSset_scale
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsset_scale_c(hid_t_f *dsid, _fcd dimname, size_t_f *dimnamelen)
{
    char *c_dimname = NULL;
    int_f ret_value = 0;

    /*
     * convert FORTRAN name to C name
     */

    if (*dimnamelen != 0)
        if (NULL == (c_dimname = (char *)HD5f2cstring(dimname, (size_t)*dimnamelen)))
            HGOTO_DONE(FAIL);

    /*
     * call H5DSset_scale function.
     */

    if (H5DSset_scale((hid_t)*dsid, c_dimname) < 0)
        HGOTO_DONE(FAIL);

done:
    if (c_dimname)
        free(c_dimname);

    return ret_value;

} /* end h5dsset_scale_c() */

/*-------------------------------------------------------------------------
 * Function: H5DSattach_scale_c
 *
 * Purpose: Calls H5DSattach_scale
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsattach_scale_c(hid_t_f *did, hid_t_f *dsid, int_f *idx)
{
    int_f ret_value = 0;

    /*
     * call H5DSset_scale function.
     */

    if (H5DSattach_scale((hid_t)*did, (hid_t)*dsid, (unsigned)*idx) < 0)
        HGOTO_DONE(FAIL);

done:
    return ret_value;

} /* end h5dsattach_scale_c() */

/*-------------------------------------------------------------------------
 * Function: H5DSdetach_scale_c
 *
 * Purpose: Calls H5DSdetach_scale
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsdetach_scale_c(hid_t_f *did, hid_t_f *dsid, int_f *idx)
{
    int_f ret_value = 0;

    /*
     * call H5DSset_scale function.
     */

    if (H5DSdetach_scale((hid_t)*did, (hid_t)*dsid, (unsigned)*idx) < 0)
        HGOTO_DONE(FAIL);

done:
    return ret_value;

} /* end h5dsdetach_scale_c() */

/*-------------------------------------------------------------------------
 * Function: H5DSis_attached_c
 *
 * Purpose: Calls H5DSis_attached
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsis_attached_c(hid_t_f *did, hid_t_f *dsid, int_f *idx, int_f *is_attached)
{
    int_f  ret_value = 0;
    htri_t c_is_attached;

    /*
     * call H5DSis_attached function.
     */

    if ((c_is_attached = H5DSis_attached((hid_t)*did, (hid_t)*dsid, (unsigned)*idx)) < 0)
        HGOTO_DONE(FAIL);

    *is_attached = (int_f)c_is_attached;

done:
    return ret_value;

} /* end h5dsis_attached_c() */

/*-------------------------------------------------------------------------
 * Function: H5DSis_scale_c
 *
 * Purpose: Calls H5DSis_scale
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsis_scale_c(hid_t_f *did, int_f *is_scale)
{
    int_f  ret_value = 0;
    htri_t c_is_scale;

    /*
     * call H5DSis_scale function.
     */

    if ((c_is_scale = H5DSis_scale((hid_t)*did)) < 0)
        HGOTO_DONE(FAIL);

    *is_scale = (int_f)c_is_scale;

done:
    return ret_value;

} /* end h5dsis_scale_c() */

/*-------------------------------------------------------------------------
 * Function: h5dsset_label_c
 *
 * Purpose: Calls H5DSset_label
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsset_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *labellen)
{
    char *c_label   = NULL;
    int_f ret_value = 0;

    /*
     * convert FORTRAN name to C name
     */

    if (NULL == (c_label = (char *)HD5f2cstring(label, (size_t)*labellen)))
        HGOTO_DONE(FAIL);

    /*
     * call H5DSset_label function.
     */

    if (H5DSset_label((hid_t)*did, (unsigned)*idx, c_label) < 0)
        HGOTO_DONE(FAIL);

done:
    if (c_label)
        free(c_label);

    return ret_value;

} /* end h5dsset_label_c() */

/*-------------------------------------------------------------------------
 * Function: h5dsget_label_c
 *
 * Purpose: Calls H5DSget_label
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsget_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *size)
{
    char   *c_label   = NULL;
    ssize_t size_c    = -1;
    int_f   ret_value = 0;

    /*
     * Allocate buffer to hold label
     */
    if ((c_label = (char *)malloc((size_t)*size + 1)) == NULL)
        HGOTO_DONE(FAIL);

    /*
     * call H5DSget_label function.
     */

    if ((size_c = H5DSget_label((hid_t)*did, (unsigned)*idx, c_label, (size_t)*size + 1)) < 0)
        HGOTO_DONE(FAIL);

    /*
     * Convert C name to FORTRAN and place it in the given buffer
     */

    HD5packFstring(c_label, _fcdtocp(label), (size_t)*size);

done:
    *size = (size_t_f)size_c; /* Don't subtract '1'  because H5DSget_label doesn't include the
                               * trailing NULL in the length calculation, Ref. HDFFV-7596 */
    if (c_label)
        free(c_label);
    return ret_value;

} /* end h5dsget_label_c() */

/*-------------------------------------------------------------------------
 * Function: h5dsget_scale_name_c
 *
 * Purpose: Calls H5DSget_scale_name
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsget_scale_name_c(hid_t_f *did, _fcd name, size_t_f *size)
{
    char   *c_scale_name = NULL;
    ssize_t size_c       = -1;
    int_f   ret_value    = 0;

    /*
     * Allocate buffer to hold name
     */
    if ((c_scale_name = (char *)malloc((size_t)*size + 1)) == NULL)
        HGOTO_DONE(FAIL);

    /*
     * call H5DSget_scale_name function.
     */

    if ((size_c = H5DSget_scale_name((hid_t)*did, c_scale_name, (size_t)*size + 1)) < 0)
        HGOTO_DONE(FAIL);

    /*
     * Convert C name to FORTRAN and place it in the given buffer
     */
    HD5packFstring(c_scale_name, _fcdtocp(name), (size_t)*size);
    *size = (size_t_f)size_c;

done:
    if (c_scale_name)
        free(c_scale_name);
    return ret_value;

} /* end h5dsget_scale_name_c() */

/*-------------------------------------------------------------------------
 * Function: H5DSget_num_scales_c
 *
 * Purpose: Calls H5DSget_num_scales
 *
 * Return: Success: 0, Failure: -1
 *
 * Comments:
 *
 *-------------------------------------------------------------------------
 */
int_f
h5dsget_num_scales_c(hid_t_f *did, int_f *idx, int_f *num_scales)
{
    int_f ret_value = 0;

    /*
     * call H5DSset_scale function.
     */

    if ((*num_scales = (int_f)H5DSget_num_scales((hid_t)*did, (unsigned)*idx)) < 0)
        HGOTO_DONE(FAIL);

done:
    return ret_value;

} /* end h5dsget_num_scales_c() */
