Index: trunk/Ohana/src/misc/src/fields.c
===================================================================
--- trunk/Ohana/src/misc/src/fields.c	(revision 10847)
+++ trunk/Ohana/src/misc/src/fields.c	(revision 10858)
@@ -1,18 +1,33 @@
 # include <ohana.h>
 # include <gfitsio.h>
+# include <sys/types.h>
+# include <regex.h>
+
+int print_fields (char *filename, char *extname, Header *header, int argc, char **argv);
 
 int main (int argc, char **argv) {
 
   int i;
+  FILE *f;
   Header header;
-  char filename[1000], buffer[1000];
-  int N, Extend, Nextend, status, GotFile, GotField;
+  char filename[1000], *Extname, extname[80];
+  int N, Nbytes, Extnum, Nextend, status, GotFile, GotField, GotExtension;
 
-  Extend = FALSE;
+  regex_t preg;
+
+  Extnum = FALSE;
   if ((N = get_argument (argc, argv, "-x"))) {
-    Extend = TRUE;
+    Extnum = TRUE;
     remove_argument (N, &argc, argv);
     Nextend = atoi (argv[N]);
     remove_argument (N, &argc, argv);
+  }
+
+  Extname = NULL;
+  if ((N = get_argument (argc, argv, "-n"))) {
+    remove_argument (N, &argc, argv);
+    Extname = strcreate (argv[N]);
+    remove_argument (N, &argc, argv);
+    regcomp (&preg, Extname, REG_EXTENDED);
   }
 
@@ -21,31 +36,81 @@
 
   while (fscanf (stdin, "%s", filename) != EOF) {
-    if (Extend) {
-      status = gfits_read_Xheader (filename, &header, Nextend);
-    } else {
-      status = gfits_read_header (filename, &header);
-    }
-    if (!status) {
-      GotFile = FALSE;
+    if (!Extnum && !Extname) {
+      GotFile &= gfits_read_header (filename, &header);
+      GotField &= print_fields (filename, NULL, &header, argc, argv);
       continue;
     }
-      
-    fprintf (stdout, "%s  ", filename);
-    for (i = 1; i < argc; i++) {
-      bzero (buffer, 1000);
-      status = gfits_scan (&header, argv[i], "%s", 1, buffer);
-      if (!status) {
-	GotField = FALSE;
+    if (Extnum) {
+      GotFile  &= gfits_read_Xheader (filename, &header, Nextend);
+      GotField &= print_fields (filename, NULL, &header, argc, argv);
+      continue;
+    } 
+
+    if (Extname) {
+      /* keep reading headers, only parse fields for matching headers */
+      Nextend = 0;
+      GotExtension = FALSE;
+      f = fopen (filename, "r");
+      if (f == NULL) {
+	GotFile = FALSE;
+	continue;
       }
-      stripwhite (buffer);
-      fprintf (stdout, "%s  ", buffer);
+      while (gfits_fread_header (f, &header)) {
+	/* extract the EXTNAME for this component (set to PHU for 0th component) */
+	status = gfits_scan (&header, "EXTNAME", "%s", 1, extname);
+	if (!status) {
+	  if (Nextend == 0) {
+	    strcpy (extname, "PHU");
+	  } else {
+	    strcpy (extname, "UNKNOWN");
+	  }
+	}
+	if (!regexec (&preg, extname, 0, NULL, 0)) {
+	  GotField &= print_fields (filename, extname, &header, argc, argv);
+	  GotExtension = TRUE;
+	}   
+    
+	Nbytes = gfits_matrix_size (&header);
+	fseek (f, Nbytes, SEEK_CUR);
+	Nextend ++;
+
+	GotFile = gfits_read_Xheader (filename, &header, Nextend);
+	continue;
+      } 
+      fclose (f);
+      if (Nextend == 0) {
+	GotFile = FALSE;
+      }
     }
-    fprintf (stdout, "\n");
+  }
 
-    gfits_free_header (&header);
-  }
+  regfree (&preg);
 
   if (!GotFile) exit (1);
   if (!GotField) exit (2);
+  if (!GotExtension) exit (3);
   exit (0);
 }
+
+int print_fields (char *filename, char *extname, Header *header, int argc, char **argv) {
+
+  int i, status, GotField;
+  char buffer[1000];
+
+  GotField = TRUE;
+
+  if (extname) {
+    fprintf (stdout, "%s[%s]  ", filename, extname);
+  } else {
+    fprintf (stdout, "%s  ", filename);
+  }
+  for (i = 1; i < argc; i++) {
+    bzero (buffer, 1000);
+    GotField &= gfits_scan (header, argv[i], "%s", 1, buffer);
+    stripwhite (buffer);
+    fprintf (stdout, "%s  ", buffer);
+  }
+  fprintf (stdout, "\n");
+  gfits_free_header (header);
+  return (GotField);
+}
