File: fitsverify.c

package info (click to toggle)
cfitsio 4.6.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,596 kB
  • sloc: ansic: 107,602; yacc: 5,410; sh: 4,513; fortran: 2,613; lex: 553; makefile: 180
file content (267 lines) | stat: -rw-r--r-- 11,283 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#include <stdio.h>
#include <string.h>
#include "fverify.h"

/* prototypes for PIL interface routines, that are not actually needed
   for this standalone version of fverify 
*/
#define PIL_LINESIZE 1024
int PILGetFname(char *parname, char *filename);
int PILGetString(char *parname, char *stringname);
int PILGetBool(char *parname, int *intvalue);
int PILPutInt(char *parname, int intvalue);


/*
   This file contains the main fverify routine, and dummy version of 
   various other headas system routines.  This is used for the stand
   alone version of fverify.
*/

int main(int argc, char *argv[])
{
    int status = 0, invalid = 0, ii, file1 = 0;
    char errormode[2] = {"w"};

    if (argc == 2 && !strcmp(argv[1],"-h")) {

printf("fitsverify -- Verify that the input files conform to the FITS Standard.\n");
printf("\n");
printf("USAGE:   fitsverify filename ...  - verify one or more FITS files\n");
printf("                                    (may use wildcard characters)\n");
printf("   or    fitsverify @filelist.txt - verify a list of FITS files\n");
printf("      \n");
printf("   Optional flags:\n");
printf("          -H  test ESO HIERARCH keywords\n");
printf("          -l  list all header keywords\n");
printf("          -q  quiet; print one-line pass/fail summary per file\n");
printf("          -e  only test for error conditions (ignore warnings)\n");
printf(" \n");
printf("   fitsverify exits with a status equal to the number of errors + warnings.\n");
printf("        \n");
printf("EXAMPLES:\n");
printf("     fitsverify -l m101.fits    - produce a detailed verificaton report of\n");
printf("                                  a single file, including a keyword listing\n");
printf("     fitsverify -q *.fits *.fit - verify all files with .fits or .fit\n");
printf("                                  extensions, writing a 1-line pass/fail\n");
printf("                                  message for each file\n");
printf(" \n");
printf("DESCRIPTION:\n");
printf("    \n");
printf("    This task reads one or more input FITS files and verifies that the\n");
printf("    files conform to the specifications of the FITS Standard, Definition\n");
printf("    of the Flexible Image Transport System (FITS), Version 3.0, available\n");
printf("    online  at http://fits.gsfc.nasa.gov/.  The input filename template may\n");
printf("    contain wildcard characters, in which case all matching files will be \n");
printf("    tested.  Alternatively, the name of an ASCII text file containing a list\n");
printf("    of file names, one per line, may be entered preceded by an '@' character.\n"); 
printf("    The following error or warning conditions will be reported:\n");
printf("    \n");
printf("    ERROR CONDITIONS\n");
printf("    \n");
printf("     - Mandatory keyword not present or out of order\n");
printf("     - Mandatory keyword has wrong datatype or illegal value\n");
printf("     - END header keyword is not present\n");
printf("     - Sum of table column widths is inconsistent with NAXIS1 value\n");
printf("     - BLANK keyword present in image with floating-point datatype\n");
printf("     - TNULLn keyword present for floating-point binary table column\n");
printf("     - Bit column has non-zero fill bits or is not left adjusted \n");
printf("     - ASCII TABLE column contains illegal value inconsistent with TFORMn\n");
printf("     - Address to a variable length array not within the data heap \n");
printf("     - Extraneous bytes in the FITS file following the last HDU    \n");
printf("     - Mandatory keyword values not expressed in fixed format\n");
printf("     - Mandatory keyword duplicated elsewhere in the header\n");
printf("     - Header contains illegal ASCII character (not ASCII 32 - 126)\n");
printf("     - Keyword name contains illegal character\n");
printf("     - Keyword value field has illegal format\n");
printf("     - Value and comment fields not separated by a slash character\n");
printf("     - END keyword not filled with blanks in columns 9 - 80\n");
printf("     - Reserved keyword with wrong datatype or illegal value\n");
printf("     - XTENSION keyword in the primary array\n");
printf("     - Column related keyword (TFIELDS, TTYPEn,TFORMn, etc.) in an image\n");
printf("     - SIMPLE, EXTEND, or BLOCKED keyword in any extension\n");
printf("     - BSCALE, BZERO, BUNIT, BLANK, DATAMAX, DATAMIN keywords in a table\n");
printf("     - Table WCS keywords (TCTYPn, TCRPXn, TCRVLn, etc.) in an image\n");
printf("     - TDIMn or THEAP keyword in an ASCII table \n");
printf("     - TBCOLn keyword in a Binary table\n");
printf("     - THEAP keyword in a binary table that has PCOUNT = 0 \n");
printf("     - XTENSION, TFORMn, TDISPn or TDIMn value contains leading space(s)\n");
printf("     - WCSAXES keyword appears after other WCS keywords\n");
printf("     - Index of any WCS keyword (CRPIXn, CRVALn, etc.) greater than \n");
printf("       value of WCSAXES\n");
printf("     - Index of any table column descriptor keyword (TTYPEn, TFORMn,\n");
printf("       etc.) greater than value of TFIELDS\n");
printf("     - TSCALn or TZEROn present for an ASCII, logical, or Bit column\n");
printf("     - TDISPn value is inconsistent with the column datatype \n");
printf("     - Length of a variable length array greater than the maximum \n");
printf("       length as given by the TFORMn keyword\n");
printf("     - ASCII table floating-point column value does not have decimal point(*)\n");
printf("     - ASCII table numeric column value has embedded space character\n");
printf("     - Logical column contains illegal value not equal to 'T', 'F', or 0\n");
printf("     - Character string column contains non-ASCII text character\n");
printf("     - Header fill bytes not all blanks\n");
printf("     - Data fill bytes not all blanks in ASCII tables or all zeros \n");
printf("       in any other type of HDU \n");
printf("     - Gaps between defined ASCII table columns contain characters with\n");
printf("       ASCII value > 127\n");
printf("    \n");
printf("    WARNING CONDITIONS\n");
printf("    \n");
printf("     - SIMPLE = F\n");
printf("     - Presence of deprecated keywords BLOCKED or EPOCH\n");
printf("     - 2 HDUs have identical EXTNAME, EXTVER, and EXTLEVEL values\n");
printf("     - BSCALE or TSCALn value = 0.\n");
printf("     - BLANK OR TNULLn value exceeds the legal range\n");
printf("     - TFORMn has 'rAw' format and r is not a multiple of w\n");
printf("     - DATE = 'dd/mm/yy' and yy is less than 10 (Y2K problem?)\n");
printf("     - Index of any WCS keyword (CRPIXn, CRVALn, etc.) greater than\n");
printf("       value of NAXIS, if the WCSAXES keyword is not present\n");
printf("     - Duplicated keyword (except COMMENT, HISTORY, blank, etc.)\n");
printf("     - Column name (TTYPEn) does not exist or contains characters \n");
printf("       other than letter, digit and underscore\n");
printf("     - Calculated checksum inconsistent with CHECKSUM or DATASUM keyword\n");
printf("        \n");
printf("    This is the stand alone version of the FTOOLS 'fverify' program.  It is\n");
printf("    maintained by the HEASARC at NASA/GSFC.  Any comments about this program\n");
printf("    should be submitted to http://heasarc.gsfc.nasa.gov/cgi-bin/ftoolshelp\n");

      return(0);
    }

    prhead = 0;           /* don't print header by default */
    prstat = 1;           /* print HDU summary by default */
    testhierarch = 0;     /* do not test ESO HIERARCH keywords by default */

    /* check for flags on the command line */
    for (ii = 1; ii < argc; ii++)
    {	 
        if ((*argv[ii] != '-') || !strcmp(argv[ii],"-") ){
            file1 = ii;
            break;
        }
	    
        if (!strcmp(argv[ii],"-l")) {
           prhead = 1;
        } else if (!strcmp(argv[ii],"-H")) {
           testhierarch = 1;
        } else if (!strcmp(argv[ii],"-e")) {
           strcpy(errormode,"e");
        } else if (!strcmp(argv[ii],"-q")) {
           prstat = 0;
        } else {
           invalid = 1;
        }
    }

    if (invalid || argc == 1 || file1 == 0) {
    /*  invalid input, so print brief help message */

      printf("\n");
      printf("fitsverify - test if the input file(s) conform to the FITS format.\n");
      printf("\n");
      printf("Usage:  fitsverify filename ...   or   fitsverify @filelist.txt\n");
      printf("\n");
      printf("  where 'filename' is a filename template (with optional wildcards), and\n");
      printf("        'filelist.txt' is an ASCII text file with a list of\n");
      printf("         FITS file names, one per line.\n");
      printf("\n");
      printf("   Optional flags:\n");
      printf("          -H  test ESO HIERARCH keywords\n");
      printf("          -l  list all header keywords\n");
      printf("          -q  quiet; print one-line pass/fail summary per file\n");
      printf("          -e  only test for error conditions; don't issue warnings\n");
      printf("\n");
      printf("Help:   fitsverify -h\n");
      return(0);
    }

    /* 
         call work function to verify that infile conforms to the FITS
         standard and write report to the output file.
    */
    for (ii = file1; ii < argc; ii++) 
    {
       status = ftverify_work(
         argv[ii],    /* name of file to verify */
         "STDOUT", /* write report to this stream */
         prhead,      /* print listing of header keywords? */
         prstat,      /* print detailed summary report */
         errormode,   /* report errors only, or errors and warnings */
         1,           /* test the data  */
         1,           /* test checksum, if checksum keywords are present */
         1,           /* test data fill areas (should contain all zeros */
         0,           /* do not test for conformance with HEASARC convensions */
                      /*    that are not required by the FITS Standard */
         testhierarch);  /* test format of ESO HIERARCH keywords? */

        if (status)
            return(status);
    }

    if  ( (totalerr + totalwrn) > 255)
        return(255);
    else
        return(totalerr + totalwrn);
}

/*------------------------------------------------------------------
  The following are all dummy stub routines for functions that are
  only needed when ftverify is built in the HEADAS environment.
--------------------------------------------------------------------*/

int PILGetFname(char *parname, char *filename)
{
  return(0);
}

int PILGetString(char *parname, char *stringname)
{
  return(0);
}

int PILGetBool(char *parname, int *intvalue)
{
  return(0);
}

int PILPutInt(char *parname, int intvalue)
{
  return(0);
}

void set_toolname(char *taskname);
void set_toolname(char *taskname)
{
  return;
}

void set_toolversion(char *taskname);
void set_toolversion(char *taskname)
{
  return;
}

void get_toolname(char *taskname);
void get_toolname(char *taskname)
{
  strcpy(taskname, "fitsverify");
  return;
}

void get_toolversion(char *taskvers);
void get_toolversion(char *taskvers)
{
  strcpy(taskvers, "4.22");
  return;
}

void headas_clobberfile(char *filename);
void headas_clobberfile(char *filename)
{
  return;
}
void HD_ERROR_THROW(char msg[256], int status);
void HD_ERROR_THROW(char msg[256], int status)
{
  return;
}