/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 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 files COPYING and Copyright.html.  COPYING can be found at the root   *
 * of the source code distribution tree; Copyright.html can be found at the  *
 * root level of an installed copy of the electronic HDF5 document set and   *
 * is linked from the top-level documents page.  It can also be found at     *
 * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have     *
 * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 * Programmer:  Robb Matzke <matzke@llnl.gov>
 *              Thursday, June 11, 1998
 *
 * Purpose:	Create an hdf5 file with a 1d dataset of uint8.
 */

/* See H5private.h for how to include system headers */
#include <hdf5.h>
#ifdef H5_STDC_HEADERS
#   include <fcntl.h>
#   include <string.h>
#   include <stdlib.h>
#   include <stdio.h>
#endif

#ifdef H5_HAVE_UNISTD_H
#   include <sys/types.h>
#   include <unistd.h>
#endif

#ifdef H5_HAVE_SYS_STAT_H
#   include <sys/stat.h>
#endif

#ifdef WIN32
#   include <io.h>
#endif


/*-------------------------------------------------------------------------
 * Function:	usage
 *
 * Purpose:	Print a usage message and exit with non-zero status
 *
 * Return:	never returns
 *
 * Programmer:	Robb Matzke
 *              Thursday, June 11, 1998
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
static void
usage (const char *argv0)
{
    fprintf (stderr, "Usage: %s -f HDF5-FILE FILES...\n", argv0);
    exit (1);
}


/*-------------------------------------------------------------------------
 * Function:	main
 *
 * Purpose:	
 *
 * Return:	Success:	0
 *
 *		Failure:	1
 *
 * Programmer:	Robb Matzke
 *              Thursday, June 11, 1998
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
int
main (int argc, char *argv[])
{
    hid_t	file, space=-1, dset=-1;
    const char	*output_name, *dset_name;
    int		argno, fd=-1;
    hsize_t	size[1];
    struct stat sb;

    /* Parse arguments */
    if (argc<4) usage (argv[0]);
    if (strcmp (argv[1], "-f")) usage (argv[0]);
    output_name = argv[2];

    /* create the file */
    H5E_BEGIN_TRY {
	if ((file = H5Fcreate (output_name, H5F_ACC_EXCL,
			       H5P_DEFAULT, H5P_DEFAULT))<0 &&
	    (file = H5Fopen (output_name, H5F_ACC_RDWR, H5P_DEFAULT)<0)) {
	    fprintf (stderr, "%s: unable to create or open hdf5 file\n",
		     output_name);
	    exit (1);
	}
    } H5E_END_TRY;
    
    /* process files from command-line */
    for (argno=3;  argno<argc; argno++) {

	/* Open the file */
	if ((dset_name=strrchr (argv[argno], '/'))) dset_name++;
	else dset_name = argv[argno];
	fprintf (stderr, "%s\n", dset_name);
	if ((fd=open (argv[argno], O_RDONLY))<0) {
	    perror (argv[argno]);
	    goto next;
	}
	if (fstat (fd, &sb)<0) {
	    perror (argv[argno]);
	    goto next;
	}

	/* Data space */
	size[0] = sb.st_size;
	if ((space = H5Screate_simple (1, size, size))<0) goto next;

	/* Dataset */
	if ((dset=H5Dcreate (file, dset_name, H5T_NATIVE_SCHAR,
			     space, H5P_DEFAULT))<0) goto next;

	
	
    next:
	if (fd>=0) close (fd);
	fd = -1;
	H5E_BEGIN_TRY {
	    if (space>=0) {
		H5Sclose (space);
		space = -1;
	    }
	    if (dset>=0) {
		H5Dclose (dset);
		dset = -1;
	    }
	} H5E_END_TRY;
    }

    /* Close the file */
    H5Fclose (file);
    return 0;
}