#include <stdio.h>
#include "iso8211.h"
CPL_CVSID("$Id: 8211view.cpp 10645 2007-01-18 02:22:39Z warmerdam $");
static void ViewRecordField( DDFField * poField );
static int ViewSubfield( DDFSubfieldDefn *poSFDefn,
const char * pachFieldData,
int nBytesRemaining );
int main( int nArgc, char ** papszArgv )
{
DDFModule oModule;
const char *pszFilename = NULL;
int bFSPTHack = FALSE;
for( int iArg = 1; iArg < nArgc; iArg++ )
{
if( EQUAL(papszArgv[iArg],"-fspt_repeating") )
bFSPTHack = TRUE;
else
pszFilename = papszArgv[iArg];
}
if( pszFilename == NULL )
{
printf( "Usage: 8211view filename\n" );
exit( 1 );
}
if( !oModule.Open( pszFilename ) )
{
exit( 1 );
}
if( bFSPTHack )
{
DDFFieldDefn *poFSPT = oModule.FindFieldDefn( "FSPT" );
if( poFSPT == NULL )
fprintf( stderr,
"unable to find FSPT field to set repeating flag.\n" );
else
poFSPT->SetRepeatingFlag( TRUE );
}
DDFRecord *poRecord;
int iRecord = 0;
while( (poRecord = oModule.ReadRecord()) != NULL )
{
printf( "Record %d (%d bytes)\n",
++iRecord, poRecord->GetDataSize() );
for( int iField = 0; iField < poRecord->GetFieldCount(); iField++ )
{
DDFField *poField = poRecord->GetField( iField );
ViewRecordField( poField );
}
}
}
static void ViewRecordField( DDFField * poField )
{
int nBytesRemaining;
const char *pachFieldData;
DDFFieldDefn *poFieldDefn = poField->GetFieldDefn();
printf( " Field %s: %s\n",
poFieldDefn->GetName(), poFieldDefn->GetDescription() );
pachFieldData = poField->GetData();
nBytesRemaining = poField->GetDataSize();
int iRepeat;
for( iRepeat = 0; iRepeat < poField->GetRepeatCount(); iRepeat++ )
{
int iSF;
for( iSF = 0; iSF < poFieldDefn->GetSubfieldCount(); iSF++ )
{
DDFSubfieldDefn *poSFDefn = poFieldDefn->GetSubfield( iSF );
int nBytesConsumed;
nBytesConsumed = ViewSubfield( poSFDefn, pachFieldData,
nBytesRemaining );
nBytesRemaining -= nBytesConsumed;
pachFieldData += nBytesConsumed;
}
}
}
static int ViewSubfield( DDFSubfieldDefn *poSFDefn,
const char * pachFieldData,
int nBytesRemaining )
{
int nBytesConsumed = 0;
switch( poSFDefn->GetType() )
{
case DDFInt:
if( poSFDefn->GetBinaryFormat() == DDFSubfieldDefn::UInt )
printf( " %s = %u\n",
poSFDefn->GetName(),
poSFDefn->ExtractIntData( pachFieldData, nBytesRemaining,
&nBytesConsumed ) );
else
printf( " %s = %d\n",
poSFDefn->GetName(),
poSFDefn->ExtractIntData( pachFieldData, nBytesRemaining,
&nBytesConsumed ) );
break;
case DDFFloat:
printf( " %s = %f\n",
poSFDefn->GetName(),
poSFDefn->ExtractFloatData( pachFieldData, nBytesRemaining,
&nBytesConsumed ) );
break;
case DDFString:
printf( " %s = `%s'\n",
poSFDefn->GetName(),
poSFDefn->ExtractStringData( pachFieldData, nBytesRemaining,
&nBytesConsumed ) );
break;
case DDFBinaryString:
{
int i;
int vrid_rcnm=0;
int vrid_rcid=0;
int foid_agen=0;
int foid_find=0;
int foid_fids=0;
GByte *pabyBString = (GByte *)
poSFDefn->ExtractStringData( pachFieldData, nBytesRemaining,
&nBytesConsumed );
printf( " %s = 0x", poSFDefn->GetName() );
for( i = 0; i < MIN(nBytesConsumed,24); i++ )
printf( "%02X", pabyBString[i] );
if( nBytesConsumed > 24 )
printf( "%s", "..." );
if ( EQUAL(poSFDefn->GetName(),"NAME") )
{
vrid_rcnm=pabyBString[0];
vrid_rcid=pabyBString[1] + (pabyBString[2]*256)+
(pabyBString[3]*65536)+ (pabyBString[4]*16777216);
printf("\tVRID RCNM = %d,RCID = %u",vrid_rcnm,vrid_rcid);
}
else if ( EQUAL(poSFDefn->GetName(),"LNAM") )
{
foid_agen=pabyBString[0] + (pabyBString[1]*256);
foid_find=pabyBString[2] + (pabyBString[3]*256)+
(pabyBString[4]*65536)+ (pabyBString[5]*16777216);
foid_fids=pabyBString[6] + (pabyBString[7]*256);
printf("\tFOID AGEN = %u,FIDN = %u,FIDS = %u",
foid_agen,foid_find,foid_fids);
}
printf( "\n" );
}
break;
}
return nBytesConsumed;
}