Index: /trunk/Ohana/src/opihi/cmd.data/fit.c
===================================================================
--- /trunk/Ohana/src/opihi/cmd.data/fit.c	(revision 3103)
+++ /trunk/Ohana/src/opihi/cmd.data/fit.c	(revision 3104)
@@ -90,5 +90,5 @@
     }
   }
-  gaussj (c, nterm, b, 1);
+  if (!gaussj (c, nterm, b, 1)) goto escape;
 
   /* print & save basic fit parameters */
@@ -112,9 +112,21 @@
   if (!Quiet) fprintf (stderr, "\n");
 
+  for (i = 0; i < nterm; i++) {
+    free (b[i]);
+    free (c[i]);
+  }
+  free (b);
+  free (c);
+  free (s);
   return (TRUE);
 
+escape:
+  for (i = 0; i < nterm; i++) {
+    free (b[i]);
+    free (c[i]);
+  }
+  free (b);
+  free (c);
+  free (s);
+  return (FALSE);
 }
-
-
-
-
Index: /trunk/Ohana/src/opihi/lib.data/gaussj.c
===================================================================
--- /trunk/Ohana/src/opihi/lib.data/gaussj.c	(revision 3103)
+++ /trunk/Ohana/src/opihi/lib.data/gaussj.c	(revision 3104)
@@ -13,7 +13,14 @@
     ipiv[j] = 0;
 
+  irow = icol = 0;
+  big = fabs(a[0][0]);
+
   for (i = 0; i < n; i++) {
     big = 0.0;
     for (j = 0; j < n; j++) {
+      if (!finite(a[i][j])) {
+	fprintf (stderr, "GAUSSJ: NaN\n");
+	goto escape;
+      }
       if (ipiv[j] != 1) {
 	for (k = 0; k < n; k++) {
@@ -28,5 +35,5 @@
 	    if (ipiv[k] > 1) {
 	      fprintf (stderr, "GAUSSJ: Singular Matrix! (1)\n");
-	      return (0);
+	      goto escape;
 	    }
 	}
@@ -44,5 +51,93 @@
     if (a[icol][icol] == 0.0) {
       fprintf (stderr, "GAUSSJ: Singular Matrix! (2)\n");
-      return (0);
+      goto escape;
+    }
+    pivinv = 1.0 / a[icol][icol];
+    a[icol][icol] = 1.0;
+    for (l = 0; l < n; l++) 
+      a[icol][l] *= pivinv;
+    for (l = 0; l < m; l++) 
+      b[icol][l] *= pivinv;
+    for (ll = 0; ll < n; ll++) {
+      if (ll != icol) {
+	dum = a[ll][icol];
+	a[ll][icol] = 0.0;
+	for (l = 0; l < n; l++) 
+	  a[ll][l] -= a[icol][l]*dum;
+	for (l = 0; l < m; l++) 
+	  b[ll][l] -= b[icol][l]*dum;
+      }
+    }
+  }
+
+  for (l = n - 1; l >= 0; l--) {
+    if (indxr[l] != indxc[l])
+      for (k = 0; k < n; k++)
+	SWAP (a[k][indxr[l]], a[k][indxc[l]]);
+  }
+  free (ipiv);
+  free (indxr);
+  free (indxc);
+  return (TRUE);
+
+escape:
+  free (ipiv);
+  free (indxr);
+  free (indxc);
+  return (FALSE);
+}
+
+
+int fgaussj (float **a, int n, float **b, int m) {
+
+  int *indxc,*indxr,*ipiv;
+  int i, icol, irow, j, k, l, ll;
+  float big,dum,pivinv;
+  
+  ALLOCATE (indxc, int, n);
+  ALLOCATE (indxr, int, n);
+  ALLOCATE (ipiv, int, n);
+  for (j = 0; j < n; j++) 
+    ipiv[j] = 0;
+
+  irow = icol = 0;
+  big = fabs(a[0][0]);
+
+  for (i = 0; i < n; i++) {
+    big = 0.0;
+    for (j = 0; j < n; j++) {
+      if (!finite(a[i][j])) {
+	fprintf (stderr, "GAUSSJ: NaN\n");
+	goto fescape;
+      }
+      if (ipiv[j] != 1) {
+	for (k = 0; k < n; k++) {
+	  if (ipiv[k] == 0) {
+	    if (fabs (a[j][k]) >= big) {
+	      big  = fabs (a[j][k]);
+	      irow = j;
+	      icol = k;
+	    }
+	  } 
+	  else 
+	    if (ipiv[k] > 1) {
+	      fprintf (stderr, "GAUSSJ: Singular Matrix! (1)\n");
+	      goto fescape;
+	    }
+	}
+      }
+    }
+    ipiv[icol]++;
+    if (irow != icol) {
+      for (l = 0; l < n; l++) 
+	SWAP (a[irow][l], a[icol][l]);
+      for (l = 0; l < m; l++) 
+	SWAP (b[irow][l], b[icol][l]);
+    }
+    indxr[i] = irow;
+    indxc[i] = icol;
+    if (a[icol][icol] == 0.0) {
+      fprintf (stderr, "GAUSSJ: Singular Matrix! (2)\n");
+      goto fescape;
     }
     pivinv = 1.0 / a[icol][icol];
@@ -73,78 +168,9 @@
   free (indxc);
   return (1);
-}
 
-
-int fgaussj (float **a, int n, float **b, int m) {
-
-  int *indxc,*indxr,*ipiv;
-  int i, icol, irow, j, k, l, ll;
-  float big,dum,pivinv;
-  
-  ALLOCATE (indxc, int, n);
-  ALLOCATE (indxr, int, n);
-  ALLOCATE (ipiv, int, n);
-  for (j = 0; j < n; j++) 
-    ipiv[j] = 0;
-
-  for (i = 0; i < n; i++) {
-    big = 0.0;
-    for (j = 0; j < n; j++) {
-      if (ipiv[j] != 1) {
-	for (k = 0; k < n; k++) {
-	  if (ipiv[k] == 0) {
-	    if (fabs (a[j][k]) >= big) {
-	      big  = fabs (a[j][k]);
-	      irow = j;
-	      icol = k;
-	    }
-	  } 
-	  else 
-	    if (ipiv[k] > 1) {
-	      fprintf (stderr, "GAUSSJ: Singular Matrix! (1)\n");
-	      return (0);
-	    }
-	}
-      }
-    }
-    ipiv[icol]++;
-    if (irow != icol) {
-      for (l = 0; l < n; l++) 
-	SWAP (a[irow][l], a[icol][l]);
-      for (l = 0; l < m; l++) 
-	SWAP (b[irow][l], b[icol][l]);
-    }
-    indxr[i] = irow;
-    indxc[i] = icol;
-    if (a[icol][icol] == 0.0) {
-      fprintf (stderr, "GAUSSJ: Singular Matrix! (2)\n");
-      return (0);
-    }
-    pivinv = 1.0 / a[icol][icol];
-    a[icol][icol] = 1.0;
-    for (l = 0; l < n; l++) 
-      a[icol][l] *= pivinv;
-    for (l = 0; l < m; l++) 
-      b[icol][l] *= pivinv;
-    for (ll = 0; ll < n; ll++) {
-      if (ll != icol) {
-	dum = a[ll][icol];
-	a[ll][icol] = 0.0;
-	for (l = 0; l < n; l++) 
-	  a[ll][l] -= a[icol][l]*dum;
-	for (l = 0; l < m; l++) 
-	  b[ll][l] -= b[icol][l]*dum;
-      }
-    }
-  }
-
-  for (l = n - 1; l >= 0; l--) {
-    if (indxr[l] != indxc[l])
-      for (k = 0; k < n; k++)
-	SWAP (a[k][indxr[l]], a[k][indxc[l]]);
-  }
+fescape:
   free (ipiv);
   free (indxr);
   free (indxc);
-  return (1);
+  return (FALSE);
 }
