Index: frmts/raw/fastdataset.cpp
===================================================================
--- frmts/raw/fastdataset.cpp	(revision 10935)
+++ frmts/raw/fastdataset.cpp	(working copy)
@@ -479,11 +479,11 @@
     pszTemp = GetValue( pszHeader, SATELLITE_NAME, SATELLITE_NAME_SIZE, TRUE );
     poDS->SetMetadataItem( "SATELLITE", pszTemp );
     if ( EQUALN(pszTemp, "LANDSAT", 7) )
-	poDS->iSatellite = LANDSAT;
+        poDS->iSatellite = LANDSAT;
     else if ( EQUALN(pszTemp, "IRS", 3) )
-	poDS->iSatellite = IRS;
+        poDS->iSatellite = IRS;
     else
-	poDS->iSatellite = IRS;
+        poDS->iSatellite = IRS;
     CPLFree( pszTemp );
 
     // Read sensor name (will read the first one only)
@@ -500,13 +500,17 @@
 
         if ( pszTemp )
             pszTemp = strstr( pszTemp, FILENAME );
+
         if ( pszTemp )
         {
-            pszTemp += strlen(FILENAME);
+            pszTemp += strlen(FILENAME) + 2;
             pszFilename = CPLScanString( pszTemp, FILENAME_SIZE, TRUE, FALSE );
         }
         else
+        {
             pszTemp = NULL;
+        }
+
         if ( poDS->FOpenChannel( pszFilename, poDS->nBands ) )
             poDS->nBands++;
         if ( pszFilename )
@@ -515,9 +519,9 @@
 
     if ( !poDS->nBands )
     {
-	CPLDebug( "FAST", "Failed to find and open band data files." );
-	delete poDS;
-	return NULL;
+        CPLDebug( "FAST", "Failed to find and open band data files." );
+        delete poDS;
+        return NULL;
     }
 
     // Read number of pixels/lines and bit depth
@@ -531,7 +535,7 @@
     {
         CPLDebug( "FAST", "Failed to find number of pixels in line." );
         delete poDS;
-	return NULL;
+        return NULL;
     }
 
     pszTemp = GetValue( pszHeader, LINES1, LINES_SIZE, FALSE );
@@ -546,13 +550,14 @@
     {
         CPLDebug( "FAST", "Failed to find number of lines in raster." );
         delete poDS;
-	return NULL;
+        return NULL;
     }
 
     pszTemp = GetValue( pszHeader, BITS_PER_PIXEL, BITS_PER_PIXEL_SIZE, FALSE );
     if ( pszTemp )
     {
-        switch( atoi(pszTemp) )
+        int nType = atoi( pszTemp );
+        switch( nType )
         {
             case 8:
             default:
@@ -652,6 +657,7 @@
     // Read 15 USGS projection parameters
     for ( i = 0; i < 15; i++ )
         adfProjParms[i] = 0.0;
+
     pszTemp = strstr( pszHeader, USGS_PARAMETERS );
     if ( pszTemp && !EQUAL( pszTemp, "" ) )
     {
@@ -671,37 +677,43 @@
     }
 
     // Read corner coordinates
-    pszTemp = strstr( pszHeader, CORNER_UPPER_LEFT );
+    //
+    // XXX: mloskot - Remember offset of coordinates block,
+    // so we avoid scanning from the beginning of the header and potential mismatch,
+    // like "LL" to "FULL SCENE"
+    const char* pszCoordsOffset = pszTemp;
+
+    pszTemp = strstr( pszCoordsOffset, CORNER_UPPER_LEFT );
     if ( pszTemp && !EQUAL( pszTemp, "" ) )
     {
-        pszTemp += strlen( CORNER_UPPER_LEFT ) + 28;
+        pszTemp += strlen( CORNER_UPPER_LEFT ) + 2;
         dfULX = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
         pszTemp += CORNER_VALUE_SIZE + 1;
         dfULY = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
     }
 
-    pszTemp = strstr( pszHeader, CORNER_UPPER_RIGHT );
+    pszTemp = strstr( pszCoordsOffset, CORNER_UPPER_RIGHT );
     if ( pszTemp && !EQUAL( pszTemp, "" ) )
     {
-        pszTemp += strlen( CORNER_UPPER_RIGHT ) + 28;
+        pszTemp += strlen( CORNER_UPPER_RIGHT ) + 2;
         dfURX = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
         pszTemp += CORNER_VALUE_SIZE + 1;
         dfURY = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
     }
 
-    pszTemp = strstr( pszHeader, CORNER_LOWER_LEFT );
+    pszTemp = strstr( pszCoordsOffset, CORNER_LOWER_LEFT );
     if ( pszTemp && !EQUAL( pszTemp, "" ) )
     {
-        pszTemp += strlen( CORNER_LOWER_LEFT ) + 28;
+        pszTemp += strlen( CORNER_LOWER_LEFT ) + 2;
         dfLLX = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
         pszTemp += CORNER_VALUE_SIZE + 1;
         dfLLY = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
     }
 
-    pszTemp = strstr( pszHeader, CORNER_LOWER_RIGHT );
+    pszTemp = strstr( pszCoordsOffset, CORNER_LOWER_RIGHT );
     if ( pszTemp && !EQUAL( pszTemp, "" ) )
     {
-        pszTemp += strlen( CORNER_LOWER_RIGHT ) + 28;
+        pszTemp += strlen( CORNER_LOWER_RIGHT ) + 2;
         dfLRX = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
         pszTemp += CORNER_VALUE_SIZE + 1;
         dfLRY = CPLScanDouble( pszTemp, CORNER_VALUE_SIZE, "C" );
@@ -726,11 +738,19 @@
             dfLRX -= (double)iZone * 1000000.0;
 
         // Create projection definition
-        oSRS.importFromUSGS( iProjSys, iZone, adfProjParms, iDatum );
+        OGRErr eErr = oSRS.importFromUSGS( iProjSys, iZone, adfProjParms, iDatum );
+        if( OGRERR_NONE != eErr )
+        {
+            CPLDebug("FAST", "Import projection from USGS failed: %d", eErr);
+        }
+
         oSRS.SetLinearUnits( SRS_UL_METER, 1.0 );
         
         // Read datum name
         pszTemp = GetValue( pszHeader, DATUM_NAME, DATUM_NAME_SIZE, FALSE );
+        
+        CPLDebug("FAST", "DATUM = %s", pszTemp);
+
         if ( EQUAL( pszTemp, "WGS84" ) )
             oSRS.SetWellKnownGeogCS( "WGS84" );
         else if ( EQUAL( pszTemp, "NAD27" ) )
@@ -741,8 +761,13 @@
 
         if ( poDS->pszProjection )
             CPLFree( poDS->pszProjection );
-        oSRS.exportToWkt( &poDS->pszProjection );
 
+        eErr = oSRS.exportToWkt( &(poDS->pszProjection) );
+        if( OGRERR_NONE != eErr )
+        {
+            CPLDebug("FAST", "Export projection to WKT USGS failed: %d", eErr);
+        }
+
         // Generate GCPs
         pasGCPList = (GDAL_GCP *) CPLCalloc( sizeof( GDAL_GCP ), 4 );
         GDALInitGCPs( 4, pasGCPList );
@@ -783,9 +808,14 @@
             poDS->adfGeoTransform[3] = 0.0;
             poDS->adfGeoTransform[4] = 0.0;
             poDS->adfGeoTransform[5] = 1.0;
+
+            // XXX - mloskot: Why the projection is deleted here?
+            // I disabled it as it seems to cause problems, see Bug 1516
+            /*
             if ( poDS->pszProjection )
                 CPLFree( poDS->pszProjection );
             poDS->pszProjection = CPLStrdup("");
+            */
         }
     }
 
@@ -796,8 +826,10 @@
     int nLineOffset = poDS->nRasterXSize * nPixelOffset;
 
     for( i = 1; i <= poDS->nBands; i++ )
+    {
         poDS->SetBand( i, new FASTRasterBand( poDS, i, poDS->fpChannels[i - 1],
 	    0, nPixelOffset, nLineOffset, poDS->eDataType, TRUE));
+    }
 
     CPLFree( pszHeader );
 

