
/****************************************************************************
 * NCSA HDF                                                                 *
 * Scientific Data Technologies                                             *
 * National Center for Supercomputing Applications                          *
 * University of Illinois at Urbana-Champaign                               *
 * 605 E. Springfield, Champaign IL 61820                                   *
 *                                                                          *
 * For conditions of distribution and use, see the accompanying             *
 * hdf/COPYING f.                                                           *
 *                                                                          *
 ****************************************************************************/


#include "H5TA.h"

#include <stdlib.h>


#define NFIELDS  5
#define NRECORDS 8

#if 1
#define  HAVE_FILL
#endif

int main( void )
{
 
 typedef struct Particle 
 {
  char   name[16];
  int    lati;
  int    longi;
  float  pressure;
  double temperature; 
 } Particle;


 /* Calculate the size and the offsets of our struct members in memory */
 size_t dst_size =  sizeof( Particle );
 size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ),
                                HOFFSET( Particle, lati ),
                                HOFFSET( Particle, longi ),
                                HOFFSET( Particle, pressure ),
                                HOFFSET( Particle, temperature )};

 
 Particle  p = {"no data",-1, -99.0f, -99.0, -1 };
 size_t dst_sizes[NFIELDS] = { sizeof( p.name),
                               sizeof( p.lati),
                               sizeof( p.longi),
                               sizeof( p.pressure),
                               sizeof( p.temperature)};
   
 /* Initially no data */
 Particle  *p_data = NULL;


 /* Define field information */
 const char *field_names[NFIELDS]  = 
	{ "Name","Latitude", "Longitude", "Pressure", "Temperature" };
 hid_t      field_type[NFIELDS];
 hid_t      string_type;
 hid_t      file_id;
 hsize_t    chunk_size = 10;
 /* Fill value particle */ 
#if defined  (HAVE_FILL)
 Particle   fill_data[1] = 
	{ "no data",-1,-1, -99.0f, -99.0 };
#else
 int        *fill_data = NULL;
#endif
 int        compress  = 0;
 hsize_t    start;      /* Record to start reading/writing */
 hsize_t    nrecords;   /* Number of records to read/write */
 herr_t     status; 


 /* Define 2 new particles to overwrite */ 
 Particle  particle_in[2] = 
	{ {"zero",0,0, 0.0f, 0.0},
	{"one",10,10, 1.0f, 10.0} };

	EXAMPLE("write records");


 /* Initialize the field field_type */
 string_type = H5Tcopy( H5T_C_S1 );
 H5Tset_size( string_type, 16 );
 field_type[0] = string_type;
 field_type[1] = H5T_NATIVE_INT;
 field_type[2] = H5T_NATIVE_INT;
 field_type[3] = H5T_NATIVE_FLOAT;
 field_type[4] = H5T_NATIVE_DOUBLE;


/* Create a new file using default properties. */
 file_id = H5Fcreate( "ex_table_03.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );

 /* Make the table */
 status=H5TBmake_table( "Table Title", file_id, "Table1",(hsize_t)NFIELDS,(hsize_t)NRECORDS, 
		                     dst_size, field_names, dst_offset, field_type, 
                       chunk_size, fill_data, compress, p_data );


 /* Overwrite 2 records starting at record 0 */
 start    = 0;      
 nrecords = 2; 
 status=H5TBwrite_records( file_id, "Table1", start, nrecords, dst_size, dst_offset, 
		dst_sizes, particle_in);

 status = H5Tclose (string_type);
 
 /* Close the file. */
 H5Fclose( file_id );

	PASSED();

 return 0;

}

