Index: trunk/psModules/src/detrend/pmFringeStats.c
===================================================================
--- trunk/psModules/src/detrend/pmFringeStats.c	(revision 7562)
+++ trunk/psModules/src/detrend/pmFringeStats.c	(revision 7566)
@@ -3,6 +3,6 @@
  *  @author Eugene Magnier, IfA
  *
- *  @version $Revision: 1.7 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2006-06-14 22:04:40 $
+ *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2006-06-14 22:23:18 $
  *
  *  Copyright 2004 IfA
@@ -249,4 +249,5 @@
 
     psArray *table = psArrayAlloc(numRows); // The table
+    table->n = numRows;
     // Translate the vectors into the required format for psFitsWriteTable()
     for (long i = 0; i < numRows; i++) {
@@ -290,27 +291,24 @@
 
     psMetadata *header = psFitsReadHeader(NULL, fits); // The FITS header
+    if (!header) {
+        psError(PS_ERR_IO, false, "Unable to read header for extension %s\n", extname);
+        return NULL;
+    }
+
+    // Read the scalars from the header
+    #define READ_SCALAR(SCALAR, NAME) \
+    int SCALAR = psMetadataLookupS32(&mdok, header, NAME); \
+    if (!mdok || SCALAR <= 0) { \
+        psError(PS_ERR_IO, true, "Unable to find " NAME " in header of extension %s.\n", extname); \
+        return NULL; \
+    }
 
     // Need to retrieve the scalars: dX, dY, nX, nY
     bool mdok = true;                   // Status of MD lookup
-    int dX = psMetadataLookupS32(&mdok, header, "PSFRNGDX");
-    if (!mdok || dX <= 0) {
-        psError(PS_ERR_IO, true, "Unable to find PSFRNGDX in header of extension %s.\n");
-        return NULL;
-    }
-    int dY = psMetadataLookupS32(&mdok, header, "PSFRNGDY");
-    if (!mdok || dY <= 0) {
-        psError(PS_ERR_IO, true, "Unable to find PSFRNGDY in header of extension %s.\n");
-        return NULL;
-    }
-    int nX = psMetadataLookupS32(&mdok, header, "PSFRNGNX");
-    if (!mdok || nX <= 0) {
-        psError(PS_ERR_IO, true, "Unable to find PSFRNGNX in header of extension %s.\n");
-        return NULL;
-    }
-    int nY = psMetadataLookupS32(&mdok, header, "PSFRNGNY");
-    if (!mdok || nY <= 0) {
-        psError(PS_ERR_IO, true, "Unable to find PSFRNGNY in header of extension %s.\n");
-        return NULL;
-    }
+    READ_SCALAR(dX, "PSFRNGDX");
+    READ_SCALAR(dY, "PSFRNGDX");
+    READ_SCALAR(nX, "PSFRNGDX");
+    READ_SCALAR(nY, "PSFRNGDX");
+    psFree(header);
 
     // Now the vectors: x, y, mask, f, df
@@ -319,14 +317,4 @@
 
     pmFringeRegions *regions = pmFringeRegionsAlloc(numRows, dX, dY, nX, nY); // The fringe regions
-    if (regions->x) {
-        psFree(regions->x);
-    }
-    if (regions->y) {
-        psFree(regions->y);
-    }
-    if (regions->mask) {
-        psFree(regions->mask);
-    }
-
     psVector *x = psVectorAlloc(numRows, PS_TYPE_F32); // x position
     psVector *y = psVectorAlloc(numRows, PS_TYPE_F32); // y position
@@ -341,38 +329,23 @@
     psVector *df = fringes->df;     // fringe stdev
 
+    #define READ_ROW(VECTOR, TYPE, NAME, DESCRIPTION) \
+    VECTOR->data.TYPE[i] = psMetadataLookup##TYPE(&mdok, row, NAME); \
+    if (!mdok) { \
+        psError(PS_ERR_IO, true, "Unable to find " #DESCRIPTION " .\n"); \
+        psFree(table); \
+        psFree(fringes); \
+        return NULL; \
+    }
+
     // Translate the table into vectors
     for (long i = 0; i < numRows; i++) {
         psMetadata *row = table->data[i]; // Table row
-        x->data.F32[i] = psMetadataLookupF32(&mdok, row, "x");
-        if (!mdok) {
-            psError(PS_ERR_IO, true, "Unable to find x position.\n");
-            psFree(fringes);
-            return NULL;
-        }
-        y->data.F32[i] = psMetadataLookupF32(&mdok, row, "y");
-        if (!mdok) {
-            psError(PS_ERR_IO, true, "Unable to find y position.\n");
-            psFree(fringes);
-            return NULL;
-        }
-        mask->data.U8[i] = psMetadataLookupF32(&mdok, row, "mask");
-        if (!mdok) {
-            psError(PS_ERR_IO, true, "Unable to find mask value.\n");
-            psFree(fringes);
-            return NULL;
-        }
-        f->data.F32[i] = psMetadataLookupF32(&mdok, row, "f");
-        if (!mdok) {
-            psError(PS_ERR_IO, true, "Unable to find fringe measurement.\n");
-            psFree(fringes);
-            return NULL;
-        }
-        df->data.F32[i] = psMetadataLookupF32(&mdok, row, "df");
-        if (!mdok) {
-            psError(PS_ERR_IO, true, "Unable to find fringe stdev.\n");
-            psFree(fringes);
-            return NULL;
-        }
-    }
+        READ_ROW(x, F32, "x", "x position");
+        READ_ROW(y, F32, "y", "y position");
+        READ_ROW(mask, U8, "mask", "mask value");
+        READ_ROW(f, F32, "f", "fringe measurement");
+        READ_ROW(df, F32, "df", "fringe standard deviation");
+    }
+    psFree(table);
 
     return fringes;
