Only in frmts/hfa/: .libs
diff -uar -x '*.o' -x '*.lo' -x '*.exe' /usr/src/gdal-1.4.0/frmts/hfa/hfa.h frmts/hfa/hfa.h
--- /usr/src/gdal-1.4.0/frmts/hfa/hfa.h	2006-12-17 17:36:43 -0600
+++ frmts/hfa/hfa.h	2007-04-08 19:54:52 -0500
@@ -217,6 +217,7 @@
                                int * pnBlockXSize, int * pnBlockYSize, 
                                int * pnOverviews, int *pnCompressionType );
 int    CPL_DLL HFAGetBandNoData( HFAHandle hHFA, int nBand, double *pdfValue );
+CPLErr CPL_DLL HFASetBandNoData( HFAHandle, int, double );
 CPLErr CPL_DLL HFAGetOverviewInfo( HFAHandle hHFA, int nBand, int nOverview, 
                                    int * pnXSize, int * pnYSize,
                                    int * pnBlockXSize, int * pnBlockYSize );
diff -uar -x '*.o' -x '*.lo' -x '*.exe' /usr/src/gdal-1.4.0/frmts/hfa/hfa_p.h frmts/hfa/hfa_p.h
--- /usr/src/gdal-1.4.0/frmts/hfa/hfa_p.h	2006-12-17 17:36:43 -0600
+++ frmts/hfa/hfa_p.h	2007-04-08 19:54:53 -0500
@@ -258,6 +258,8 @@
     const char * GetBandName();
     void SetBandName(const char *pszName);
 
+    CPLErr	SetNoDataValue( double );
+    
     CPLErr	GetPCT( int *, double **, double **, double **, double ** );
     CPLErr	SetPCT( int, double *, double *, double *, double * );
 
diff -uar -x '*.o' -x '*.lo' -x '*.exe' /usr/src/gdal-1.4.0/frmts/hfa/hfaband.cpp frmts/hfa/hfaband.cpp
--- /usr/src/gdal-1.4.0/frmts/hfa/hfaband.cpp	2006-12-06 00:46:13 -0600
+++ frmts/hfa/hfaband.cpp	2007-04-08 19:54:53 -0500
@@ -1435,6 +1435,42 @@
 }
 
 /************************************************************************/
+/*                         SetNoDataValue()                             */
+/*                                                                      */
+/*      Set the band no-data value                                      */
+/************************************************************************/
+
+CPLErr HFABand::SetNoDataValue( double dfValue )
+{
+	CPLErr eErr = CE_Failure;
+	
+	if ( psInfo->eAccess == HFA_Update )
+	{
+		HFAEntry *poNDNode = poNode->GetNamedChild( "Eimg_NonInitializedValue" );
+		
+		if ( poNDNode == NULL )
+		{
+			poNDNode = new HFAEntry( psInfo,
+									 "Eimg_NonInitializedValue",
+									 "Eimg_NonInitializedValue",
+									 poNode );
+		}
+		
+		poNDNode->MakeData( 8 + 12 + 8 );
+		poNDNode->SetPosition();
+		
+		if ( poNDNode->SetDoubleField( "valueBD", dfValue) != CE_Failure )
+		{
+			bNoDataSet = TRUE;
+			dfNoData = dfValue;
+			eErr = CE_None;
+		}
+	}
+	
+	return eErr;	
+}
+
+/************************************************************************/
 /*                               GetPCT()                               */
 /*                                                                      */
 /*      Return PCT information, if any exists.                          */
diff -uar -x '*.o' -x '*.lo' -x '*.exe' /usr/src/gdal-1.4.0/frmts/hfa/hfadataset.cpp frmts/hfa/hfadataset.cpp
--- /usr/src/gdal-1.4.0/frmts/hfa/hfadataset.cpp	2006-12-17 17:36:43 -0600
+++ frmts/hfa/hfadataset.cpp	2007-04-08 19:54:53 -0500
@@ -496,6 +496,7 @@
     virtual double GetMinimum( int *pbSuccess = NULL );
     virtual double GetMaximum(int *pbSuccess = NULL );
     virtual double GetNoDataValue( int *pbSuccess = NULL );
+    virtual CPLErr SetNoDataValue( double );
 
     virtual CPLErr SetMetadata( char **, const char * = "" );
     virtual CPLErr SetMetadataItem( const char *, const char *, const char * = "" );
@@ -797,7 +798,7 @@
 }
 
 /************************************************************************/
-/*                             GetNoData()                              */
+/*                             GetNoDataValue()                         */
 /************************************************************************/
 
 double HFARasterBand::GetNoDataValue( int *pbSuccess )
@@ -815,6 +816,15 @@
 }
 
 /************************************************************************/
+/*                             SetNoDataValue()                         */
+/************************************************************************/
+
+CPLErr HFARasterBand::SetNoDataValue( double dfValue )
+{
+	return HFASetBandNoData( hHFA, nBand, dfValue );
+}
+
+/************************************************************************/
 /*                             GetMinimum()                             */
 /************************************************************************/
 
diff -uar -x '*.o' -x '*.lo' -x '*.exe' /usr/src/gdal-1.4.0/frmts/hfa/hfafield.cpp frmts/hfa/hfafield.cpp
--- /usr/src/gdal-1.4.0/frmts/hfa/hfafield.cpp	2006-06-30 16:23:11 -0500
+++ frmts/hfa/hfafield.cpp	2007-04-09 00:54:47 -0500
@@ -704,6 +704,62 @@
       }
       break;
 
+      case 'b':
+      {
+          // for now let's just do nRows = 1, nColumns = 1
+    	  // somehow, though, we'll need to be able to set this dynamically
+    	  GInt32 nRows = 1;
+    	  GInt32 nColumns = 1;
+
+    	  CPLAssert( nRows >= 1 && nColumns >= 1 );
+    	  
+          if( nIndexValue < 0 || nIndexValue >= nRows * nColumns )
+              return CE_Failure;
+
+    	  GInt16 nBaseItemType;
+    	  
+    	  // just implementing double for the moment
+    	  switch (chReqType)
+    	  {
+    		  case 'd':
+    			  nBaseItemType = EPT_f64;
+    			  break;
+    		  
+    		  default:
+    			  return CE_Failure;
+    			  break;
+    	  }
+    	  
+          HFAStandard( 4, &nRows );
+          memcpy( pabyData, &nRows, 4 );
+          HFAStandard( 4, &nColumns );
+          memcpy( pabyData+4, &nColumns, 4 );
+          HFAStandard( 2, &nBaseItemType );
+          memcpy ( pabyData+8, &nBaseItemType, 2 );
+          
+          // We ignore the 2 byte objecttype value. 
+
+          nDataSize -= 12;
+          
+          if ( chReqType == 'd' )
+          {
+        	  if( nIndexValue*8 + 8 > nDataSize )
+        	  {
+        		  CPLError( CE_Failure, CPLE_AppDefined,
+        			  "Attempt to extend field %s in node past end of data,\n"
+        			  "not currently supported.",
+        			  pszField );
+        		  return CE_Failure;
+        	  }
+        	  
+        	  double dfNumber = dfDoubleValue;
+        	  
+        	  HFAStandard( 8, &dfNumber );
+        	  memcpy( pabyData + 12 + nIndexValue*8, &dfNumber, 8 );
+          }
+      }
+      break;    	  
+    	  
       case 'o':
         if( poItemObjectType != NULL )
         {
diff -uar -x '*.o' -x '*.lo' -x '*.exe' /usr/src/gdal-1.4.0/frmts/hfa/hfaopen.cpp frmts/hfa/hfaopen.cpp
--- /usr/src/gdal-1.4.0/frmts/hfa/hfaopen.cpp	2006-12-17 17:36:43 -0600
+++ frmts/hfa/hfaopen.cpp	2007-04-08 19:54:53 -0500
@@ -671,6 +671,26 @@
 }
 
 /************************************************************************/
+/*                          HFASetBandNoData()                          */
+/*                                                                      */
+/*      attempts to set a no-data value on the given band               */
+/************************************************************************/
+
+CPLErr HFASetBandNoData( HFAHandle hHFA, int nBand, double dfValue )
+
+{
+	if ( nBand < 0 || nBand > hHFA->nBands )
+	{
+		CPLAssert( FALSE );
+		return CE_Failure;
+	}
+	
+	HFABand *poBand = hHFA->papoBand[nBand-1];
+	
+	return poBand->SetNoDataValue( dfValue );
+}
+
+/************************************************************************/
 /*                         HFAGetOverviewInfo()                         */
 /************************************************************************/
 

