/*============================================================================
WCSLIB 4.3 - an implementation of the FITS WCS standard.
Copyright (C) 1995-2007, Mark Calabretta
This file is part of WCSLIB.
WCSLIB is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
WCSLIB is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with WCSLIB. If not, see .
Correspondence concerning WCSLIB may be directed to:
Internet email: mcalabre@atnf.csiro.au
Postal address: Dr. Mark Calabretta
Australia Telescope National Facility, CSIRO
PO Box 76
Epping NSW 1710
AUSTRALIA
Author: Mark Calabretta, Australia Telescope National Facility
http://www.atnf.csiro.au/~mcalabre/index.html
$Id: tfitshdr.c,v 4.3 2007/12/27 05:35:51 cal103 Exp $
*=============================================================================
*
* tfitshdr tests fitshdr(), the FITS parser for image headers, by reading a
* test header and printing the resulting fitskey structs.
*
* Input comes from file 'pih.fits' using either fits_hdr2str() from CFITSIO
* if the DO_CFITSIO preprocessor is defined, or read directly using fgets()
* otherwise.
*
* If the DO_WCSHDR preprocessor macro is defined, wcshdr() will be called
* first to extract all WCS-related keyrecords from the input header before
* passing it on to fitshdr().
*
*---------------------------------------------------------------------------*/
#include
#include
#include
#include
#if defined HAVE_CFITSIO && defined DO_CFITSIO
#include
#endif
#ifdef DO_WCSHDR
#include
#endif
#include
int main()
{
char infile[] = "pih.fits";
char text[80];
int i, j, k, nkeyrec, nkeyids, nreject, status;
struct fitskey *keys, *kptr;
struct fitskeyid keyids[8];
#if defined HAVE_CFITSIO && defined DO_CFITSIO
char *header;
fitsfile *fptr;
#else
char keyrec[81], header[288001];
int end;
FILE *fptr;
#endif
#ifdef DO_WCSHDR
struct wcsprm *wcs;
int ctrl, nwcs, relax;
#endif
/* Set line buffering in case stdout is redirected to a file, otherwise
* stdout and stderr messages will be jumbled (stderr is unbuffered). */
setvbuf(stdout, NULL, _IOLBF, 0);
printf("Testing FITS image header parser (tfitshdr.c)\n"
"---------------------------------------------\n\n");
/* Read in the FITS header. */
#if defined HAVE_CFITSIO && defined DO_CFITSIO
status = 0;
if (fits_open_file(&fptr, infile, READONLY, &status)) {
fits_report_error(stderr, status);
return 1;
}
if (fits_hdr2str(fptr, 0, NULL, 0, &header, &nkeyrec, &status)) {
fits_report_error(stderr, status);
return 1;
}
fits_close_file(fptr, &status);
#else
if ((fptr = fopen(infile, "r")) == 0) {
printf("ERROR opening %s\n", infile);
return 1;
}
k = 0;
end = 0;
nkeyrec = 0;
for (j = 0; j < 100; j++) {
for (i = 0; i < 36; i++) {
if (fgets(keyrec, 81, fptr) == 0) {
break;
}
strncpy(header+k, keyrec, 80);
k += 80;
nkeyrec++;
if (strncmp(keyrec, "END ", 8) == 0) {
/* An END keyrecord was read, but read the rest of the block. */
end = 1;
}
}
if (end) break;
}
fclose(fptr);
#endif
printf("Found %d header keyrecords.\n", nkeyrec);
#ifdef DO_WCSHDR
/* Cull recognized, syntactically valid WCS keyrecords from the header. */
relax = WCSHDR_all;
ctrl = -1;
if (status = wcspih(header, nkeyrec, relax, ctrl, &nreject, &nwcs, &wcs)) {
fprintf(stderr, "wcspih ERROR %d: %s.\n", status, wcs_errmsg[status]);
return 1;
}
/* Number remaining. */
nkeyrec = strlen(header) / 80;
#endif
/* Specific keywords to be located or culled. */
strcpy(keyids[0].name, "SIMPLE ");
strcpy(keyids[1].name, "BITPIX ");
strcpy(keyids[2].name, "NAXIS ");
strcpy(keyids[3].name, "COMMENT ");
strcpy(keyids[4].name, "HISTORY ");
strcpy(keyids[5].name, " ");
strcpy(keyids[6].name, "END ");
nkeyids = 7;
if (nkeyids) {
printf("\nThe following keyrecords will not be listed:\n");
for (i = 0; i < nkeyids; i++) {
printf(" \"%8s\"\n", keyids[i].name);
}
}
/* Parse the header. */
if ((status = fitshdr(header, nkeyrec, nkeyids, keyids, &nreject,
&keys))) {
printf("fitskey ERROR %d: %s.\n", status, fitshdr_errmsg[status]);
}
#if defined HAVE_CFITSIO && defined DO_CFITSIO
free(header);
#endif
/* Report the results. */
printf("\n%d header keyrecords parsed by fitshdr(), %d rejected:\n\n",
nkeyrec, nreject);
kptr = keys;
for (i = 0; i < nkeyrec; i++, kptr++) {
/* Skip syntactically valid keyrecords that were indexed. */
if (kptr->keyno < 0 && !kptr->status) continue;
/* Basic keyrecord info. */
printf("%4d%5d %-8s%3d", kptr->keyno, kptr->status, kptr->keyword,
kptr->type);
/* Format the keyvalue for output. */
switch (abs(kptr->type)%10) {
case 1:
/* Logical. */
sprintf(text, "%c", kptr->keyvalue.i?'T':'F');
break;
case 2:
/* 32-bit signed integer. */
sprintf(text, "%d", kptr->keyvalue.i);
break;
case 3:
/* 64-bit signed integer. */
#ifdef WCSLIB_INT64
sprintf(text, "%+lld", kptr->keyvalue.k);
#else
if (kptr->keyvalue.k[2]) {
sprintf(text, "%+d%09d%09d", kptr->keyvalue.k[2],
abs(kptr->keyvalue.k[1]),
abs(kptr->keyvalue.k[0]));
} else {
sprintf(text, "%+d%09d", kptr->keyvalue.k[1],
abs(kptr->keyvalue.k[0]));
}
#endif
break;
case 4:
/* Very long integer. */
k = 0;
for (j = 7; j > 0; j--) {
if (kptr->keyvalue.l[j]) {
k = j;
break;
}
}
sprintf(text, "%+d", kptr->keyvalue.l[k]);
for (j = k-1; j >= 0; j--) {
sprintf(text+strlen(text), "%09d", abs(kptr->keyvalue.l[j]));
}
break;
case 5:
/* Float. */
sprintf(text, "%+13.6E", kptr->keyvalue.f);
break;
case 6:
/* Int complex. */
sprintf(text, "%.0f %.0f", kptr->keyvalue.c[0],
kptr->keyvalue.c[1]);
break;
case 7:
/* Float complex. */
sprintf(text, "%+13.6E %+13.6E", kptr->keyvalue.c[0],
kptr->keyvalue.c[1]);
break;
case 8:
/* String. */
sprintf(text, "\"%s\"", kptr->keyvalue.s);
break;
default:
/* No value. */
*text = '\0';
break;
}
if (kptr->type > 0) {
/* Keyvalue successfully extracted. */
printf(" %s", text);
} else if (kptr->type < 0) {
/* Syntax error of some type while extracting the keyvalue. */
printf(" (%s)", text);
}
/* Units? */
if (kptr->ulen) {
printf(" %.*s", kptr->ulen-2, kptr->comment+1);
}
/* Comment text or reject keyrecord. */
printf("\n%s\n", kptr->comment);
}
/* Print indexes. */
printf("\n\nIndexes of selected keywords:\n");
for (i = 0; i < nkeyids; i++) {
printf("%-8s%5d%5d%5d", keyids[i].name, keyids[i].count,
keyids[i].idx[0], keyids[i].idx[1]);
/* Print logical (SIMPLE) and integer (BITPIX, NAXIS) values. */
if (keyids[i].count) {
kptr = keys + keyids[i].idx[0];
printf("%4d", kptr->type);
if (kptr->type == 1) {
printf("%5c", kptr->keyvalue.i?'T':'F');
} else if (kptr->type == 2) {
printf("%5d", kptr->keyvalue.i);
}
}
printf("\n");
}
free(keys);
return 0;
}