ultimatepp/bazaar/plugin/gdal/frmts/hfa/hfadictionary.cpp
cxl 23ff1e7e82 .gdal moved to bazaar
git-svn-id: svn://ultimatepp.org/upp/trunk@9273 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2015-12-07 13:36:24 +00:00

276 lines
8.9 KiB
C++

/******************************************************************************
* $Id: hfadictionary.cpp 21184 2010-12-01 03:11:03Z warmerdam $
*
* Project: Erdas Imagine (.img) Translator
* Purpose: Implementation of the HFADictionary class for managing the
* dictionary read from the HFA file. Most work done by the
* HFAType, and HFAField classes.
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 1999, Intergraph Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#include "hfa_p.h"
#include "cpl_conv.h"
CPL_CVSID("$Id: hfadictionary.cpp 21184 2010-12-01 03:11:03Z warmerdam $");
static const char *apszDefDefn[] = {
"Edsc_Table",
"{1:lnumrows,}Edsc_Table",
"Edsc_Column",
"{1:lnumRows,1:LcolumnDataPtr,1:e4:integer,real,complex,string,dataType,1:lmaxNumChars,}Edsc_Column",
"Eprj_Size",
"{1:dwidth,1:dheight,}Eprj_Size",
"Eprj_Coordinate",
"{1:dx,1:dy,}Eprj_Coordinate",
"Eprj_MapInfo",
"{0:pcproName,1:*oEprj_Coordinate,upperLeftCenter,1:*oEprj_Coordinate,lowerRightCenter,1:*oEprj_Size,pixelSize,0:pcunits,}Eprj_MapInfo",
"Eimg_StatisticsParameters830",
"{0:poEmif_String,LayerNames,1:*bExcludedValues,1:oEmif_String,AOIname,1:lSkipFactorX,1:lSkipFactorY,1:*oEdsc_BinFunction,BinFunction,}Eimg_StatisticsParameters830",
"Esta_Statistics",
"{1:dminimum,1:dmaximum,1:dmean,1:dmedian,1:dmode,1:dstddev,}Esta_Statistics",
"Edsc_BinFunction",
"{1:lnumBins,1:e4:direct,linear,logarithmic,explicit,binFunctionType,1:dminLimit,1:dmaxLimit,1:*bbinLimits,}Edsc_BinFunction",
"Eimg_NonInitializedValue",
"{1:*bvalueBD,}Eimg_NonInitializedValue",
"Eprj_MapProjection842",
"{1:x{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject,projection,1:x{0:pcstring,}Emif_String,title,}Eprj_MapProjection842",
"Emif_MIFObject",
"{1:x{0:pcstring,}Emif_String,type,1:x{0:pcstring,}Emif_String,MIFDictionary,0:pCMIFObject,}Emif_MIFObject",
"Eprj_ProParameters",
"{1:e2:EPRJ_INTERNAL,EPRJ_EXTERNAL,proType,1:lproNumber,0:pcproExeName,0:pcproName,1:lproZone,0:pdproParams,1:*oEprj_Spheroid,proSpheroid,}Eprj_ProParameters",
"Eprj_Datum",
"{0:pcdatumname,1:e3:EPRJ_DATUM_PARAMETRIC,EPRJ_DATUM_GRID,EPRJ_DATUM_REGRESSION,type,0:pdparams,0:pcgridname,}Eprj_Datum",
"Eprj_Spheroid",
"{0:pcsphereName,1:da,1:db,1:deSquared,1:dradius,}Eprj_Spheroid",
NULL,
NULL };
/************************************************************************/
/* ==================================================================== */
/* HFADictionary */
/* ==================================================================== */
/************************************************************************/
/************************************************************************/
/* HFADictionary() */
/************************************************************************/
HFADictionary::HFADictionary( const char * pszString )
{
int i;
nTypes = 0;
nTypesMax = 0;
papoTypes = NULL;
osDictionaryText = pszString;
bDictionaryTextDirty = FALSE;
/* -------------------------------------------------------------------- */
/* Read all the types. */
/* -------------------------------------------------------------------- */
while( pszString != NULL && *pszString != '.' )
{
HFAType *poNewType;
poNewType = new HFAType();
pszString = poNewType->Initialize( pszString );
if( pszString != NULL )
AddType( poNewType );
else
delete poNewType;
}
/* -------------------------------------------------------------------- */
/* Complete the definitions. */
/* -------------------------------------------------------------------- */
for( i = 0; i < nTypes; i++ )
{
papoTypes[i]->CompleteDefn( this );
}
}
/************************************************************************/
/* ~HFADictionary() */
/************************************************************************/
HFADictionary::~HFADictionary()
{
int i;
for( i = 0; i < nTypes; i++ )
delete papoTypes[i];
CPLFree( papoTypes );
}
/************************************************************************/
/* AddType() */
/************************************************************************/
void HFADictionary::AddType( HFAType *poType )
{
if( nTypes == nTypesMax )
{
nTypesMax = nTypes * 2 + 10;
papoTypes = (HFAType **) CPLRealloc( papoTypes,
sizeof(void*) * nTypesMax );
}
papoTypes[nTypes++] = poType;
}
/************************************************************************/
/* FindType() */
/************************************************************************/
HFAType * HFADictionary::FindType( const char * pszName )
{
int i;
for( i = 0; i < nTypes; i++ )
{
if( papoTypes[i]->pszTypeName != NULL &&
strcmp(pszName,papoTypes[i]->pszTypeName) == 0 )
return( papoTypes[i] );
}
/* -------------------------------------------------------------------- */
/* Check if this is a type have other knowledge of. If so, add */
/* it to the dictionary now. I'm not sure how some files end */
/* up being distributed using types not in the dictionary. */
/* -------------------------------------------------------------------- */
for( i = 0; apszDefDefn[i] != NULL; i += 2 )
{
if( strcmp( pszName, apszDefDefn[i] ) == 0 )
{
HFAType *poNewType = new HFAType();
poNewType->Initialize( apszDefDefn[i+1] );
AddType( poNewType );
poNewType->CompleteDefn( this );
if( osDictionaryText.size() > 0 )
osDictionaryText.erase( osDictionaryText.size() - 1, 1 );
osDictionaryText += apszDefDefn[i+1];
osDictionaryText += ",.";
bDictionaryTextDirty = TRUE;
return poNewType;
}
}
return NULL;
}
/************************************************************************/
/* GetItemSize() */
/* */
/* Get the size of a basic (atomic) item. */
/************************************************************************/
int HFADictionary::GetItemSize( char chType )
{
switch( chType )
{
case '1':
case '2':
case '4':
case 'c':
case 'C':
return 1;
case 'e':
case 's':
case 'S':
return 2;
case 't':
case 'l':
case 'L':
case 'f':
return 4;
case 'd':
case 'm':
return 8;
case 'M':
return 16;
case 'b':
return -1;
case 'o':
case 'x':
return 0;
default:
CPLAssert( FALSE );
}
return 0;
}
/************************************************************************/
/* Dump() */
/************************************************************************/
void HFADictionary::Dump( FILE * fp )
{
int i;
VSIFPrintf( fp, "\nHFADictionary:\n" );
for( i = 0; i < nTypes; i++ )
{
papoTypes[i]->Dump( fp );
}
}