std::vector<HFAEntry*> HFAEntry::FindChildren( const char *pszName, const char *pszType ) { std::vector<HFAEntry*> apoChildren; HFAEntry *poEntry; if( this == NULL ) return apoChildren; for( poEntry = GetChild(); poEntry != NULL; poEntry = poEntry->GetNext() ) { std::vector<HFAEntry*> apoEntryChildren; size_t i; if( (pszName == NULL || EQUAL(poEntry->GetName(),pszName)) && (pszType == NULL || EQUAL(poEntry->GetType(),pszType)) ) apoChildren.push_back( poEntry ); apoEntryChildren = poEntry->FindChildren( pszName, pszType ); for( i = 0; i < apoEntryChildren.size(); i++ ) apoChildren.push_back( apoEntryChildren[i] ); } return apoChildren; }
HFAEntry *HFAEntry::GetNamedChild( const char * pszName ) { int nNameLen; HFAEntry *poEntry; /* -------------------------------------------------------------------- */ /* Establish how much of this name path is for the next child. */ /* Up to the '.' or end of estring. */ /* -------------------------------------------------------------------- */ for( nNameLen = 0; pszName[nNameLen] != '.' && pszName[nNameLen] != '\0' && pszName[nNameLen] != ':'; nNameLen++ ) {} /* -------------------------------------------------------------------- */ /* Scan children looking for this name. */ /* -------------------------------------------------------------------- */ for( poEntry = GetChild(); poEntry != NULL; poEntry = poEntry->GetNext() ) { if( EQUALN(poEntry->GetName(),pszName,nNameLen) && (int) strlen(poEntry->GetName()) == nNameLen ) { if( pszName[nNameLen] == '.' ) { HFAEntry *poResult; poResult = poEntry->GetNamedChild( pszName+nNameLen+1 ); if( poResult != NULL ) return poResult; } else return poEntry; } } return NULL; }
HFAEntry *HFAEntry::GetNamedChild( const char * pszName ) { int nNameLen; HFAEntry *poEntry; /* -------------------------------------------------------------------- */ /* Establish how much of this name path is for the next child. */ /* Up to the '.' or end of estring. */ /* -------------------------------------------------------------------- */ for( nNameLen = 0; pszName[nNameLen] != '.' && pszName[nNameLen] != '\0' && pszName[nNameLen] != ':'; nNameLen++ ) {} /* -------------------------------------------------------------------- */ /* Scan children looking for this name. */ /* -------------------------------------------------------------------- */ for( poEntry = GetChild(); poEntry != NULL; poEntry = poEntry->GetNext() ) { if( EQUALN(poEntry->GetName(),pszName,nNameLen) && (int) strlen(poEntry->GetName()) == nNameLen ) { break; } } /* -------------------------------------------------------------------- */ /* Is there a remainder to process? */ /* -------------------------------------------------------------------- */ if( poEntry != NULL && pszName[nNameLen] == '.' ) return( poEntry->GetNamedChild( pszName+nNameLen+1 ) ); else return( poEntry ); }
std::vector<HFAEntry*> HFAEntry::FindChildren( const char *pszName, const char *pszType, int nRecLevel, int* pbErrorDetected ) { std::vector<HFAEntry*> apoChildren; if( *pbErrorDetected ) return apoChildren; if( nRecLevel == 50 ) { CPLError(CE_Failure, CPLE_AppDefined, "Bad entry structure: recursion detected !"); *pbErrorDetected = TRUE; return apoChildren; } for( HFAEntry *poEntry = GetChild(); poEntry != NULL; poEntry = poEntry->GetNext() ) { std::vector<HFAEntry*> apoEntryChildren; if( (pszName == NULL || EQUAL(poEntry->GetName(), pszName)) && (pszType == NULL || EQUAL(poEntry->GetType(), pszType)) ) apoChildren.push_back( poEntry ); apoEntryChildren = poEntry->FindChildren(pszName, pszType, nRecLevel + 1, pbErrorDetected); if( *pbErrorDetected ) return apoChildren; for( size_t i = 0; i < apoEntryChildren.size(); i++ ) apoChildren.push_back( apoEntryChildren[i] ); } return apoChildren; }