#include "hdf.h"

#define  FILE_NAME      "General_HDFobjects.hdf"
#define  VG_NAME        "AN Vgroup"
#define  FILE_LABEL_TXT "General HDF objects"
#define  FILE_DESC_TXT  "This is an HDF file that contains general HDF objects"
#define  DATA_LABEL_TXT "Common AN Vgroup"
#define  DATA_DESC_TXT  "This is a vgroup that is used to test data annotations"

int main( )
{
   /************************* Variable declaration **************************/

   intn   status_n;     /* returned status for functions returning an intn  */
   int32  status_32,    /* returned status for functions returning an int32 */
          file_id,      /* HDF file identifier */
          an_id,        /* AN interface identifier */
          file_label_id,  /* file label identifier */
          file_desc_id,   /* file description identifier */
          data_label_id,  /* data label identifier */
          data_desc_id,   /* data description identifier */
          vgroup_id;
   uint16 vgroup_tag, vgroup_ref;

   /********************** End of variable declaration **********************/

   /*
   * Create the HDF file.
   */
   file_id = Hopen (FILE_NAME, DFACC_CREATE, 0);

   /*
   * Initialize the AN interface.
   */
   an_id = ANstart (file_id);

   /*
   * Create the file label.
   */
   file_label_id = ANcreatef (an_id, AN_FILE_LABEL);

   /*
   * Write the annotations to the file label.
   */
   status_32 = ANwriteann (file_label_id, FILE_LABEL_TXT, 
                          strlen (FILE_LABEL_TXT));

   /*
   * Create file description.
   */
   file_desc_id = ANcreatef (an_id, AN_FILE_DESC);

   /*
   * Write the annotation to the file description.  
   */
   status_32 = ANwriteann (file_desc_id, FILE_DESC_TXT, 
                          strlen (FILE_DESC_TXT));

   /*
   * Create a vgroup in the V interface.  Note that the vgroup's ref number 
   * is set to -1 for creating and the access mode is "w" for writing.
   */
   status_n = Vstart (file_id);
   vgroup_id = Vattach (file_id, -1, "w");
   status_32 = Vsetname (vgroup_id, VG_NAME);

   /*
   * Obtain the tag and ref number of the vgroup for subsequent
   * references.  
   */
   vgroup_tag = (uint16) VQuerytag (vgroup_id);
   vgroup_ref = (uint16) VQueryref (vgroup_id);

   /*
   * Create the data label for the vgroup identified by its tag 
   * and ref number.
   */
   data_label_id = ANcreate (an_id, vgroup_tag, vgroup_ref, AN_DATA_LABEL);

   /*
   * Write the annotation text to the data label.
   */
   status_32 = ANwriteann (data_label_id, DATA_LABEL_TXT, 
                          strlen (DATA_LABEL_TXT));

   /*
   * Create the data description for the vgroup identified by its tag 
   * and ref number.
   */
   data_desc_id = ANcreate (an_id, vgroup_tag, vgroup_ref, AN_DATA_DESC);

   /*
   * Write the annotation text to the data description.
   */
   status_32 = ANwriteann (data_desc_id, DATA_DESC_TXT, strlen (DATA_DESC_TXT));

   /*
   * Teminate access to the vgroup and to the V interface.
   */
   status_32 = Vdetach (vgroup_id);
   status_n = Vend (file_id);

   /*
   * Terminate access to each annotation explicitly.
   */
   status_n = ANendaccess (file_label_id);
   status_n = ANendaccess (file_desc_id);
   status_n = ANendaccess (data_label_id);
   status_n = ANendaccess (data_desc_id);

   /*
   * Terminate access to the AN interface and close the HDF file.
   */
   status_32 = ANend (an_id);
   status_n = Hclose (file_id);
   return 0;
}
