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;
}