void CCBlockSet::Kill(void) { int i; CCBlock* pcBlock; for (i = 0; i < mapcBlocks.NumElements(); i++) { pcBlock = *mapcBlocks.Get(i); pcBlock->Kill(); } mapcBlocks.Kill(); mcRawTokens.Kill(); mpcStack = NULL; mpcFile = NULL; }
////////////////////////////////////////////////////////////////////////// // // // // ////////////////////////////////////////////////////////////////////////// BOOL CPreprocessor::PreprocessBlockSets(CCFile* pcFile, CCFile* pcFromFile) { CCBlockSet* pcBlocksSet; SCTokenBlock sResult; BOOL bResult; miIncludeDepth++; LogIncludes(pcFile); mpcCurrentFile = pcFile; LoadFile(pcFile); bResult = TRUE; if (!mpcCurrentFile->IsPragmaOnced()) { sResult.Init(0, 0); for (;;) { LogBlocks(pcFile, sResult); pcBlocksSet = pcFile->macBlockSets.SafeGet(sResult.iBlockIndex); if (!pcBlocksSet) { break; } if (pcBlocksSet->IsDirective()) { //The conditional directives need to be expanded so &pcFile->mcStack is needed. I suspect a #define directive will be expanded too. I don't know if this is good or bad. It's bad. Write a test for it. sResult = PreprocessTokens(NULL, &pcFile->mcStack, &pcBlocksSet->mcRawTokens, sResult.iBlockIndex, sResult.iTokenIndex); if (sResult.iTokenIndex == -1) { bResult = FALSE; break; } } else { CStackMarkExtended cMark; CCBlock* pcBlockProcessed; CCBlock* pcBlockMatching; pcFile->mcStack.Mark(&cMark); pcBlockProcessed = pcBlocksSet->CreateBlock(); sResult = PreprocessTokens(&pcBlockProcessed->mcTokens, &pcFile->mcStack, &pcBlocksSet->mcRawTokens, sResult.iBlockIndex, sResult.iTokenIndex); pcBlockMatching = pcBlocksSet->GetMatchingBlock(pcBlockProcessed); if (!pcBlockMatching) { pcBlocksSet->AddBlock(pcBlockProcessed); pcBlockProcessed->SetNext(sResult.iTokenIndex, sResult.iBlockIndex); pcBlockMatching = pcBlockProcessed; } else { pcBlockProcessed->Kill(); pcFile->mcStack.Rollback(&cMark); miBlockReuse++; sResult = pcBlockMatching->msNext; } cMark.Kill(); if (sResult.iTokenIndex == -1) { bResult = FALSE; break; } mpcUnit->mcTokens.mcTokens.mcArray.Add((CPPToken**)&pcBlockMatching); } pcBlocksSet = pcFile->macBlockSets.SafeGet(sResult.iBlockIndex); if (pcBlocksSet) { if (pcBlocksSet->mcRawTokens.mcArray.NumElements() == sResult.iTokenIndex) { sResult.iBlockIndex++; sResult.iTokenIndex = 0; } } } } mpcCurrentFile = pcFromFile; miIncludeDepth--; return bResult; }