/* This code is part of the tng binary trajectory format.
 *
 * Written by Magnus Lundborg
 * Copyright (c) 2012-2013, The GROMACS development team.
 * Check out http://www.gromacs.org for more information.
 *
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the Revised BSD License.
 */

#include "tng/tng_io.h"

/* The following is for calling the library from fortran */

tng_function_status DECLSPECDLLEXPORT tng_trajectory_init_(tng_trajectory_t *tng_data_p)
{
    return(tng_trajectory_init(tng_data_p));
}

tng_function_status DECLSPECDLLEXPORT tng_trajectory_destroy_(tng_trajectory_t *tng_data_p)
{
    return(tng_trajectory_destroy(tng_data_p));
}

tng_function_status DECLSPECDLLEXPORT tng_trajectory_init_from_src_(tng_trajectory_t src,
                                                   tng_trajectory_t *dest_p)
{
    return(tng_trajectory_init_from_src(src, dest_p));
}

tng_function_status DECLSPECDLLEXPORT tng_input_file_get_(const tng_trajectory_t tng_data,
                                        char *file_name, const int max_len)
{
    return(tng_input_file_get(tng_data, file_name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_input_file_set_(tng_trajectory_t tng_data,
                                        const char *file_name, int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, file_name, name_len);
    name[name_len] = 0;
    stat = tng_input_file_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_output_file_get_(const tng_trajectory_t tng_data,
                                         char *file_name, const int max_len)
{
    return(tng_output_file_get(tng_data, file_name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_output_file_set_(tng_trajectory_t tng_data,
                                         const char *file_name, int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, file_name, name_len);
    name[name_len] = 0;
    stat = tng_output_file_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_first_program_name_get_(const tng_trajectory_t tng_data,
                                                char *name, const int max_len)
{
    return(tng_first_program_name_get(tng_data, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_output_file_endianness_get_
                (tng_trajectory_t tng_data, tng_file_endianness *endianness)
{
    return(tng_output_file_endianness_get(tng_data, endianness));
}

tng_function_status DECLSPECDLLEXPORT tng_output_file_endianness_set_
                (tng_trajectory_t tng_data, const tng_file_endianness *endianness)
{
    return(tng_output_file_endianness_set(tng_data, *endianness));
}

tng_function_status DECLSPECDLLEXPORT tng_first_program_name_set_(tng_trajectory_t tng_data,
                                                const char *new_name,
                                                int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_first_program_name_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_last_program_name_get_(const tng_trajectory_t tng_data,
                                                char *name, const int max_len)
{
    return(tng_last_program_name_get(tng_data, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_last_program_name_set_(tng_trajectory_t tng_data,
                                               const char *new_name,
                                               int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_last_program_name_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_first_user_name_get_(const tng_trajectory_t tng_data,
                                             char *name, const int max_len)
{
    return(tng_first_user_name_get(tng_data, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_first_user_name_set_(tng_trajectory_t tng_data,
                                             const char *new_name,
                                             int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_first_user_name_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_last_user_name_get_(const tng_trajectory_t tng_data,
                                            char *name, const int max_len)
{
    return(tng_last_user_name_get(tng_data, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_last_user_name_set_(tng_trajectory_t tng_data,
                                            const char *new_name,
                                            int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_last_user_name_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_first_computer_name_get_(const tng_trajectory_t tng_data,
                                                 char *name, const int max_len)
{
    return(tng_first_computer_name_get(tng_data, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_first_computer_name_set_(tng_trajectory_t tng_data,
                                                 const char *new_name,
                                                 int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_first_computer_name_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_last_computer_name_get_(const tng_trajectory_t tng_data,
                                                 char *name, const int max_len)
{
    return(tng_last_computer_name_get(tng_data, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_last_computer_name_set_(tng_trajectory_t tng_data,
                                                const char *new_name,
                                                int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_last_computer_name_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_first_signature_get_
                (const tng_trajectory_t tng_data,
                 char *signature, const int max_len)
{
    return(tng_first_signature_get(tng_data, signature, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_first_signature_set_(tng_trajectory_t tng_data,
                                             const char *signature,
                                             int sign_len)
{
    char *sign = malloc(sign_len + 1);
    tng_function_status stat;

    strncpy(sign, signature, sign_len);
    sign[sign_len] = 0;
    stat = tng_first_signature_set(tng_data, sign);
    free(sign);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_last_signature_get_
                (const tng_trajectory_t tng_data,
                 char *signature, const int max_len)
{
    return(tng_last_signature_get(tng_data, signature, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_last_signature_set_
                (tng_trajectory_t tng_data,
                 const char *signature,
                 int sign_len)
{
    char *sign = malloc(sign_len + 1);
    tng_function_status stat;

    strncpy(sign, signature, sign_len);
    sign[sign_len] = 0;
    stat = tng_last_signature_set(tng_data, sign);
    free(sign);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_forcefield_name_get_
                (const tng_trajectory_t tng_data,
                 char *name, const int max_len)
{
    return(tng_forcefield_name_get(tng_data, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_forcefield_name_set_
                (tng_trajectory_t tng_data,
                 const char *new_name,
                 int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_forcefield_name_set(tng_data, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_medium_stride_length_get_
                (const tng_trajectory_t tng_data,
                 int64_t *len)
{
    return(tng_medium_stride_length_get(tng_data, len));
}

tng_function_status DECLSPECDLLEXPORT tng_medium_stride_length_set_
                (tng_trajectory_t tng_data,
                 const int64_t *len)
{
    return(tng_medium_stride_length_set(tng_data, *len));
}

tng_function_status DECLSPECDLLEXPORT tng_long_stride_length_get_
                (const tng_trajectory_t tng_data,
                 int64_t *len)
{
    return(tng_long_stride_length_get(tng_data, len));
}

tng_function_status DECLSPECDLLEXPORT tng_long_stride_length_set_
                (tng_trajectory_t tng_data,
                 const int64_t *len)
{
    return(tng_long_stride_length_set(tng_data, *len));
}

tng_function_status DECLSPECDLLEXPORT tng_time_per_frame_get_
                (const tng_trajectory_t tng_data,
                 double *time)
{
    return(tng_time_per_frame_get(tng_data, time));
}

tng_function_status DECLSPECDLLEXPORT tng_time_per_frame_set_
                (tng_trajectory_t tng_data,
                 const double *time)
{
    return(tng_time_per_frame_set(tng_data, *time));
}

tng_function_status DECLSPECDLLEXPORT tng_input_file_len_get_
                (const tng_trajectory_t tng_data,
                 int64_t *len)
{
    return(tng_input_file_len_get(tng_data, len));
}

tng_function_status DECLSPECDLLEXPORT tng_num_frames_get_
                (const tng_trajectory_t tng_data,
                 int64_t *n)
{
    return(tng_num_frames_get(tng_data, n));
}

tng_function_status DECLSPECDLLEXPORT tng_num_particles_get_
                (const tng_trajectory_t tng_data,
                 int64_t *n)
{
    return(tng_num_particles_get(tng_data, n));
}

tng_function_status DECLSPECDLLEXPORT tng_num_molecules_get_
                (const tng_trajectory_t tng_data,
                 int64_t *n)
{
    return(tng_num_molecules_get(tng_data, n));
}

tng_function_status DECLSPECDLLEXPORT tng_distance_unit_exponential_get_
                (const tng_trajectory_t tng_data,
                 int64_t *exp)
{
    return(tng_distance_unit_exponential_get(tng_data, exp));
}

tng_function_status DECLSPECDLLEXPORT tng_distance_unit_exponential_set_
                (const tng_trajectory_t tng_data,
                 const int64_t *exp)
{
    return(tng_distance_unit_exponential_set(tng_data, *exp));
}

tng_function_status DECLSPECDLLEXPORT tng_num_frames_per_frame_set_get_
                (const tng_trajectory_t tng_data,
                 int64_t *n)
{
    return(tng_num_frames_per_frame_set_get(tng_data, n));
}

tng_function_status DECLSPECDLLEXPORT tng_num_frames_per_frame_set_set_
                (const tng_trajectory_t tng_data,
                 int64_t *n)
{
    return(tng_num_frames_per_frame_set_set(tng_data, *n));
}

tng_function_status DECLSPECDLLEXPORT tng_num_frame_sets_get_
                (const tng_trajectory_t tng_data,
                 int64_t *n)
{
    return(tng_num_frame_sets_get(tng_data, n));
}

tng_function_status DECLSPECDLLEXPORT tng_current_frame_set_get_
                (tng_trajectory_t tng_data,
                 tng_trajectory_frame_set_t *frame_set_p)
{
    return(tng_current_frame_set_get(tng_data, frame_set_p));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_nr_find_(tng_trajectory_t tng_data,
                                                             const int64_t *nr)
{
    return(tng_frame_set_nr_find(tng_data, *nr));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_of_frame_find_
                (tng_trajectory_t tng_data,
                 const int64_t *frame)
{
    return(tng_frame_set_of_frame_find(tng_data, *frame));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_next_frame_set_file_pos_get_
                (const tng_trajectory_t tng_data,
                 const tng_trajectory_frame_set_t frame_set,
                 int64_t *pos)
{
    return(tng_frame_set_next_frame_set_file_pos_get(tng_data, frame_set, pos));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_prev_frame_set_file_pos_get_
                (const tng_trajectory_t tng_data,
                 const tng_trajectory_frame_set_t frame_set,
                 int64_t *pos)
{
    return(tng_frame_set_prev_frame_set_file_pos_get(tng_data, frame_set, pos));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_frame_range_get_
                (const tng_trajectory_t tng_data,
                 const tng_trajectory_frame_set_t frame_set,
                 int64_t *first_frame,
                 int64_t *last_frame)
{
    return(tng_frame_set_frame_range_get(tng_data, frame_set, first_frame,
                                         last_frame));
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_init_(const tng_trajectory_t tng_data,
                                       tng_molecule_t molecule)
{
    return(tng_molecule_init(tng_data, molecule));
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_destroy_
                (const tng_trajectory_t tng_data,
                 tng_molecule_t molecule)
{
    return(tng_molecule_destroy(tng_data, molecule));
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_add_(tng_trajectory_t tng_data,
                                                        const char *name,
                                                        tng_molecule_t *molecule,
                                                        int name_len)
{
    char *n = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(n, name, name_len);
    n[name_len] = 0;
    stat = tng_molecule_add(tng_data, n, molecule);
    free(n);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_name_set_(tng_trajectory_t tng_data,
                                                             tng_molecule_t molecule,
                                                             const char *new_name,
                                                             int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_molecule_name_set(tng_data, molecule, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_cnt_get_(tng_trajectory_t tng_data,
                                                            tng_molecule_t molecule,
                                                            int64_t *cnt)
{
    return(tng_molecule_cnt_get(tng_data, molecule, cnt));
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_cnt_set_(tng_trajectory_t tng_data,
                                                            tng_molecule_t molecule,
                                                            int64_t *cnt)
{
    return(tng_molecule_cnt_set(tng_data, molecule, *cnt));
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_find_(tng_trajectory_t tng_data,
                                                         const char *name,
                                                         int64_t nr,
                                                         tng_molecule_t *molecule,
                                                         int name_len)
{
    char *n = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(n, name, name_len);
    n[name_len] = 0;
    stat = tng_molecule_find(tng_data, n, nr, molecule);
    free(n);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_chain_find_(tng_trajectory_t tng_data,
                                                               tng_molecule_t molecule,
                                                               const char *name,
                                                               int64_t id,
                                                               tng_chain_t *chain,
                                                               int name_len)
{
    char *n = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(n, name, name_len);
    n[name_len] = 0;
    stat = tng_molecule_chain_find(tng_data, molecule, n, id, chain);
    free(n);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_chain_add_(tng_trajectory_t tng_data,
                                                              tng_molecule_t molecule,
                                                              const char *name,
                                                              tng_chain_t *chain,
                                                              int name_len)
{
    char *n = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(n, name, name_len);
    n[name_len] = 0;
    stat = tng_molecule_chain_add(tng_data, molecule, n, chain);
    free(n);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_chain_name_set_(tng_trajectory_t tng_data,
                                                          tng_chain_t chain,
                                                          const char *new_name,
                                                          int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_chain_name_set(tng_data, chain, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_chain_residue_add_(tng_trajectory_t tng_data,
                                                             tng_chain_t chain,
                                                             const char *name,
                                                             tng_residue_t *residue,
                                                             int name_len)
{
    char *n = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(n, name, name_len);
    n[name_len] = 0;
    stat = tng_chain_residue_add(tng_data, chain, n, residue);
    free(n);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_residue_name_set_(tng_trajectory_t tng_data,
                                                            tng_residue_t residue,
                                                            const char *new_name,
                                                            int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_residue_name_set(tng_data, residue, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_residue_atom_add_(tng_trajectory_t tng_data,
                                                            tng_residue_t residue,
                                                            const char *atom_name,
                                                            const char *atom_type,
                                                            tng_atom_t *atom,
                                                            int name_len,
                                                            int type_len)
{
    char *name = malloc(name_len + 1);
    char *type = malloc(type_len + 1);
    tng_function_status stat;

    strncpy(name, atom_name, name_len);
    strncpy(type, atom_type, type_len);
    name[name_len] = 0;
    type[type_len] = 0;
    stat = tng_residue_atom_add(tng_data, residue, name, type, atom);
    free(name);
    free(type);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_atom_name_set_(tng_trajectory_t tng_data,
                                                         tng_atom_t atom,
                                                         const char *new_name,
                                                         int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, new_name, name_len);
    name[name_len] = 0;
    stat = tng_atom_name_set(tng_data, atom, name);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_atom_type_set_(tng_trajectory_t tng_data,
                                                         tng_atom_t atom,
                                                         const char *new_type,
                                                         int type_len)
{
    char *type = malloc(type_len + 1);
    tng_function_status stat;

    strncpy(type, new_type, type_len);
    type[type_len] = 0;
    stat = tng_atom_type_set(tng_data, atom, type);
    free(type);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_molecule_name_of_particle_nr_get_
                (const tng_trajectory_t tng_data,
                 const int64_t nr,
                 char *name,
                 int max_len)
{
    return(tng_molecule_name_of_particle_nr_get(tng_data, nr, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_chain_name_of_particle_nr_get_
                (const tng_trajectory_t tng_data,
                 const int64_t nr,
                 char *name,
                 int max_len)
{
    return(tng_chain_name_of_particle_nr_get(tng_data, nr, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_residue_name_of_particle_nr_get_
                (const tng_trajectory_t tng_data,
                 const int64_t nr,
                 char *name,
                 int max_len)
{
    return(tng_residue_name_of_particle_nr_get(tng_data, nr, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_residue_id_of_particle_nr_get_
                (const tng_trajectory_t tng_data,
                 const int64_t nr,
                 int64_t *id)
{
    return(tng_residue_id_of_particle_nr_get(tng_data, nr, id));
}

tng_function_status DECLSPECDLLEXPORT tng_atom_name_of_particle_nr_get_
                (const tng_trajectory_t tng_data,
                 const int64_t nr,
                 char *name,
                 int max_len)
{
    return(tng_atom_name_of_particle_nr_get(tng_data, nr, name, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_atom_type_of_particle_nr_get_
                (const tng_trajectory_t tng_data,
                 const int64_t nr,
                 char *type,
                 int max_len)
{
    return(tng_atom_type_of_particle_nr_get(tng_data, nr, type, max_len));
}

tng_function_status DECLSPECDLLEXPORT tng_particle_mapping_add_
                (tng_trajectory_t tng_data,
                 const int64_t *first_particle_number,
                 const int64_t *n_particles,
                 const int64_t *mapping_table)
{
    return(tng_particle_mapping_add(tng_data, *first_particle_number,
                                    *n_particles, mapping_table));
}

tng_function_status DECLSPECDLLEXPORT tng_file_headers_read_(tng_trajectory_t tng_data,
                                                             const char *hash_mode)
{
    return(tng_file_headers_read(tng_data, *hash_mode));
}

tng_function_status DECLSPECDLLEXPORT tng_file_headers_write_
                (tng_trajectory_t tng_data,
                 const char *hash_mode)
{
    return(tng_file_headers_write(tng_data, *hash_mode));
}

tng_function_status DECLSPECDLLEXPORT tng_block_read_next_
                (tng_trajectory_t tng_data,
                 tng_gen_block_t block_data,
                 const char *hash_mode)
{
    return(tng_block_read_next(tng_data, block_data, *hash_mode));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_read_next_
                (tng_trajectory_t tng_data,
                 const char *hash_mode)
{
    return(tng_frame_set_read_next(tng_data, *hash_mode));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_write_(tng_trajectory_t tng_data,
                                                           const char *hash_mode)
{
    return(tng_frame_set_write(tng_data, *hash_mode));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_new_(tng_trajectory_t tng_data,
                                                         const int64_t *first_frame,
                                                         const int64_t *n_frames)
{
    return(tng_frame_set_new(tng_data, *first_frame, *n_frames));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_with_time_new_
                (tng_trajectory_t tng_data,
                 const int64_t *first_frame,
                 const int64_t *n_frames,
                 const double *first_frame_time)
{
    return(tng_frame_set_with_time_new(tng_data, *first_frame, *n_frames,
                             *first_frame_time));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_set_first_frame_time_set_
                (tng_trajectory_t tng_data,
                 const double *first_frame_time)
{
    return(tng_frame_set_first_frame_time_set(tng_data, *first_frame_time));
}

tng_function_status DECLSPECDLLEXPORT tng_data_block_add_
                (tng_trajectory_t tng_data,
                 const int64_t *id,
                 const char *block_name,
                 const char *datatype,
                 const char *block_type_flag,
                 int64_t *n_frames,
                 const int64_t *n_values_per_frame,
                 const int64_t *stride_length,
                 const int64_t *codec_id,
                 void *new_data,
                 int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, block_name, name_len);
    name[name_len] = 0;
    stat = tng_data_block_add(tng_data, *id, name, *datatype, *block_type_flag,
                              *n_frames, *n_values_per_frame, *stride_length,
                              *codec_id, new_data);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_particle_data_block_add_
                (tng_trajectory_t tng_data,
                 const int64_t *id,
                 const char *block_name,
                 const char *datatype,
                 const char *block_type_flag,
                 int64_t *n_frames,
                 const int64_t *n_values_per_frame,
                 const int64_t *stride_length,
                 const int64_t *first_particle_number,
                 const int64_t *n_particles,
                 const int64_t *codec_id,
                 void *new_data,
                 int name_len)
{
    char *name = malloc(name_len + 1);
    tng_function_status stat;

    strncpy(name, block_name, name_len);
    name[name_len] = 0;
    stat = tng_particle_data_block_add(tng_data, *id, name, *datatype,
                                       *block_type_flag, *n_frames,
                                       *n_values_per_frame, *stride_length,
                                       *first_particle_number, *n_particles,
                                       *codec_id, new_data);
    free(name);
    return(stat);
}

tng_function_status DECLSPECDLLEXPORT tng_frame_data_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const int64_t *block_id,
                 const void *data,
                 const char *hash_mode)
{
    return(tng_frame_data_write(tng_data, *frame_nr, *block_id, data,
                                *hash_mode));
}

tng_function_status DECLSPECDLLEXPORT tng_frame_particle_data_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const int64_t *block_id,
                 const int64_t *val_first_particle,
                 const int64_t *val_n_particles,
                 const void *data,
                 const char *hash_mode)
{
    return(tng_frame_particle_data_write(tng_data, *frame_nr, *block_id,
                                         *val_first_particle, *val_n_particles,
                                         data, *hash_mode));
}

tng_function_status DECLSPECDLLEXPORT tng_data_values_free_
                (const tng_trajectory_t tng_data,
                 union data_values **values,
                 const int64_t *n_frames,
                 const int64_t *n_values_per_frame,
                 const char *type)
{
    return(tng_data_values_free(tng_data, values, *n_frames,
                                *n_values_per_frame, *type));
}

tng_function_status DECLSPECDLLEXPORT tng_particle_data_values_free_
                (const tng_trajectory_t tng_data,
                 union data_values ***values,
                 const int64_t *n_frames,
                 const int64_t *n_particles,
                 const int64_t *n_values_per_frame,
                 const char *type)
{
    return(tng_particle_data_values_free(tng_data, values, *n_frames, *n_particles,
                                         *n_values_per_frame, *type));
}

tng_function_status DECLSPECDLLEXPORT tng_data_get_
                (tng_trajectory_t tng_data,
                 const int64_t *block_id,
                 union data_values ***values,
                 int64_t *n_frames,
                 int64_t *n_values_per_frame,
                 char *type)
{
    return(tng_data_get(tng_data, *block_id, values, n_frames,
                        n_values_per_frame, type));
}

tng_function_status DECLSPECDLLEXPORT tng_data_interval_get_
                (tng_trajectory_t tng_data,
                 const int64_t *block_id,
                 const int64_t *start_frame_nr,
                 const int64_t *end_frame_nr,
                 const char *hash_mode,
                 union data_values ***values,
                 int64_t *n_values_per_frame,
                 char *type)
{
    return(tng_data_interval_get(tng_data, *block_id, *start_frame_nr,
                                 *end_frame_nr, *hash_mode, values,
                                 n_values_per_frame, type));
}

tng_function_status DECLSPECDLLEXPORT tng_particle_data_get_
                (tng_trajectory_t tng_data,
                 const int64_t *block_id,
                 union data_values ****values,
                 int64_t *n_frames,
                 int64_t *n_particles,
                 int64_t *n_values_per_frame,
                 char *type)
{
    return(tng_particle_data_get(tng_data, *block_id, values, n_frames,
                                 n_particles, n_values_per_frame, type));
}

tng_function_status DECLSPECDLLEXPORT tng_particle_data_interval_get_
                (tng_trajectory_t tng_data,
                 const int64_t *block_id,
                 const int64_t *start_frame_nr,
                 const int64_t *end_frame_nr,
                 const char *hash_mode,
                 union data_values ****values,
                 int64_t *n_particles,
                 int64_t *n_values_per_frame,
                 char *type)
{
    return(tng_particle_data_interval_get(tng_data, *block_id, *start_frame_nr,
                                          *end_frame_nr, *hash_mode, values,
                                          n_particles, n_values_per_frame,
                                          type));
}

tng_function_status DECLSPECDLLEXPORT tng_time_get_str_
                (const tng_trajectory_t tng_data,
                 char *time, int64_t str_len)
{
    return(tng_time_get_str(tng_data, time));
}

tng_function_status DECLSPECDLLEXPORT tng_util_trajectory_open_
                (const char *filename, const char *mode,
                 tng_trajectory_t *tng_data_p)
{
    return(tng_util_trajectory_open(filename, *mode, tng_data_p));
}

tng_function_status DECLSPECDLLEXPORT tng_util_trajectory_close_
                (tng_trajectory_t *tng_data_p)
{
    return(tng_util_trajectory_close(tng_data_p));
}

tng_function_status DECLSPECDLLEXPORT tng_util_pos_read_
                (tng_trajectory_t tng_data,
                 float **positions,
                 int64_t *stride_length)
{
    return(tng_util_pos_read(tng_data, positions, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_vel_read_
                (tng_trajectory_t tng_data,
                 float **velocities,
                 int64_t *stride_length)
{
    return(tng_util_vel_read(tng_data, velocities, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_force_read_
                (tng_trajectory_t tng_data,
                 float **forces,
                 int64_t *stride_length)
{
    return(tng_util_force_read(tng_data, forces, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_read_
                (tng_trajectory_t tng_data,
                 float **box_shape,
                 int64_t *stride_length)
{
    return(tng_util_box_shape_read(tng_data, box_shape, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_pos_read_range_
                (tng_trajectory_t tng_data,
                 const int64_t *first_frame,
                 const int64_t *last_frame,
                 float **positions,
                 int64_t *stride_length)
{
    return(tng_util_pos_read_range(tng_data, *first_frame, *last_frame,
                                         positions, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_vel_read_range_
                (tng_trajectory_t tng_data,
                 const int64_t *first_frame,
                 const int64_t *last_frame,
                 float **velocities,
                 int64_t *stride_length)
{
    return(tng_util_vel_read_range(tng_data, *first_frame, *last_frame,
                                         velocities, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_force_read_range_
                (tng_trajectory_t tng_data,
                 const int64_t *first_frame,
                 const int64_t *last_frame,
                 float **forces,
                 int64_t *stride_length)
{
    return(tng_util_force_read_range(tng_data, *first_frame, *last_frame,
                                         forces, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_read_range_
                (tng_trajectory_t tng_data,
                 const int64_t *first_frame,
                 const int64_t *last_frame,
                 float **box_shape,
                 int64_t *stride_length)
{
    return(tng_util_box_shape_read_range(tng_data, *first_frame, *last_frame,
                                         box_shape, stride_length));
}

tng_function_status DECLSPECDLLEXPORT tng_util_generic_write_frequency_set_
                (tng_trajectory_t tng_data,
                 const int64_t *f,
                 const int64_t *n_values_per_frame,
                 const int64_t *block_id,
                 const char *block_name,
                 const char *particle_dependency,
                 const char *compression)
{
    return(tng_util_generic_write_frequency_set(tng_data, *f,
                                                *n_values_per_frame, *block_id,
                                                block_name,
                                                *particle_dependency,
                                                *compression));
}

tng_function_status DECLSPECDLLEXPORT tng_util_pos_write_frequency_set_
                (tng_trajectory_t tng_data,
                 const int64_t *f)
{
    return(tng_util_pos_write_frequency_set(tng_data, *f));
}

tng_function_status DECLSPECDLLEXPORT tng_util_vel_write_frequency_set_
                (tng_trajectory_t tng_data,
                 const int64_t *f)
{
    return(tng_util_vel_write_frequency_set(tng_data, *f));
}

tng_function_status DECLSPECDLLEXPORT tng_util_force_write_frequency_set_
                (tng_trajectory_t tng_data,
                 const int64_t *f)
{
    return(tng_util_force_write_frequency_set(tng_data, *f));
}

tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_write_frequency_set_
                (tng_trajectory_t tng_data,
                 const int64_t *f)
{
    return(tng_util_box_shape_write_frequency_set(tng_data, *f));
}

tng_function_status DECLSPECDLLEXPORT tng_util_generic_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const float *values,
                 const int64_t *n_values_per_frame,
                 const int64_t *block_id,
                 const char *block_name,
                 const char *particle_dependency,
                 const char *compression)
{
    return(tng_util_generic_write(tng_data, *frame_nr, values,
                                  *n_values_per_frame, *block_id, block_name,
                                  *particle_dependency, *compression));
}

tng_function_status DECLSPECDLLEXPORT tng_util_pos_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const float *positions)
{
    return(tng_util_vel_write(tng_data, *frame_nr, positions));
}

tng_function_status DECLSPECDLLEXPORT tng_util_vel_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const float *velocities)
{
    return(tng_util_vel_write(tng_data, *frame_nr, velocities));
}

tng_function_status DECLSPECDLLEXPORT tng_util_force_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const float *forces)
{
    return(tng_util_force_write(tng_data, *frame_nr, forces));
}

tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const float *box_shape)
{
    return(tng_util_box_shape_write(tng_data, *frame_nr, box_shape));
}

tng_function_status DECLSPECDLLEXPORT tng_util_pos_with_time_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const int64_t *time,
                 const float *positions)
{
    return(tng_util_pos_with_time_write(tng_data, *frame_nr, *time,
                                        positions));
}

tng_function_status DECLSPECDLLEXPORT tng_util_vel_with_time_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const int64_t *time,
                 const float *velocities)
{
    return(tng_util_vel_with_time_write(tng_data, *frame_nr, *time,
                                        velocities));
}

tng_function_status DECLSPECDLLEXPORT tng_util_force_with_time_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const int64_t *time,
                 const float *forces)
{
    return(tng_util_force_with_time_write(tng_data, *frame_nr, *time,
                                          forces));
}

tng_function_status DECLSPECDLLEXPORT tng_util_box_shape_with_time_write_
                (tng_trajectory_t tng_data,
                 const int64_t *frame_nr,
                 const int64_t *time,
                 const float *box_shape)
{
    return(tng_util_box_shape_with_time_write(tng_data, *frame_nr, *time,
                                              box_shape));
}
