#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fitsio.h>

#define NDAT 500

void printerror( int status);

int main(int argc,char *argv[])
{
  fitsfile *fp;
  int j,status,nfound,anynull;
  long naxes[2]={NDAT, NDAT};
  float nullval, az=0., el=90.;
  char array[NDAT],*buffer=array,str[32],key[32],*keys;

  if(argc!=2 && argc!=3){
    printf("Usage: %s input [keyword]\n",argv[0]);
    exit(1);
  }
  if(argc==3) sscanf(argv[2],"%s",key);
  
  fprintf(stderr,"Read %s  ... ",argv[1]);
  status=0;
  if(fits_open_file(&fp, argv[1], READWRITE, &status))
    printerror(status);
  strcpy(str,"sample");
  if (fits_update_key(fp, TSTRING, "OBJECT", str, "Target Field Name", &status))
    printerror(status);
  strcpy(str,"hh:mm:ss.sss");
  if (fits_update_key(fp, TSTRING, "RA", str, "RA of pointing", &status))
    printerror(status);
  strcpy(str,"+dd:mm:ss.ss");
  if (fits_update_key(fp, TSTRING, "DEC", str, "DEC of pointing", &status))
    printerror(status);
  strcpy(str,"hh:mm:ss.sss");
  if (fits_update_key(fp, TSTRING, "RA2000", str, "RA(J2000.0) of pointing", &status))
    printerror(status);
  strcpy(str,"+dd:mm:ss.ss");
  if (fits_update_key(fp, TSTRING, "DEC2000", str, "DEC(J2000.0) of pointing", &status))
    printerror(status);
  if (fits_update_key(fp, TFLOAT, "AZIMUTH", &az, "Azimuth angle of telescope (degree)", &status))
    printerror(status);
  if (fits_update_key(fp, TFLOAT, "ALTITUDE", &el, "Altitude angle of telescope (degree)", &status))
    printerror(status);
  if(fits_close_file(fp, &status))
    printerror(status);
  fprintf(stderr,"OK\n");

  fprintf(stderr,"Read %s  ... ",argv[1]);
  status=0;
  if(fits_open_table(&fp, argv[1], READWRITE, &status))
    printerror(status);
  if(fits_read_keys_lng(fp, "NAXIS", 1, 2, naxes, &nfound, &status)) 
    printerror(status);
  fprintf(stderr,"%ld x %ld format ... ",naxes[0],naxes[1]);
  nullval = 0;
  for (j = 1; j <= naxes[1]; j++) {
    strcpy(buffer,"hh mm ss.ss");
    if (fits_write_col(fp, TSTRING, 3, j, 1, 1LL, &buffer, &status))
      printerror(status);
    strcpy(buffer,"+dd mm ss.s");
    if (fits_write_col(fp, TSTRING, 4, j, 1, 1LL, &buffer, &status))
      printerror(status);
    if(argc==3){
      if (fits_read_col(fp, TSTRING, 16, j, 1, 1LL, &nullval, &buffer, &anynull, &status))
	printerror(status);
      keys=strstr(buffer,key);
      if(keys!=NULL){
	strncpy(keys,"--------------------------------",strlen(key));
	if (fits_write_col(fp, TSTRING, 16, j, 1, 1LL, &buffer, &status))
	  printerror(status);
      }
    }
  }
  if(fits_close_file(fp, &status))
    printerror(status);
  fprintf(stderr,"OK\n");
  return(0);
}

void printerror( int status)
{
    /*****************************************************/
    /* Print out cfitsio error messages and exit program */
    /*****************************************************/

    char status_str[FLEN_STATUS], errmsg[FLEN_ERRMSG];
  
    if (status)
      fprintf(stderr, "\n*** Error occurred during program execution ***\n");

    fits_get_errstatus(status, status_str);   /* get the error description */
    fprintf(stderr, "\nstatus = %d: %s\n", status, status_str);

    /* get first message; null if stack is empty */
    if ( fits_read_errmsg(errmsg) ) 
    {
         fprintf(stderr, "\nError message stack:\n");
         fprintf(stderr, " %s\n", errmsg);

         while ( fits_read_errmsg(errmsg) )  /* get remaining messages */
             fprintf(stderr, " %s\n", errmsg);
    }

    exit( status );       /* terminate the program, returning error status */
}
