/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "cpp.h"

/*
	Nlist *				pMacro;
	Token *				pTokenWhereMacroBecomesValid;
	struct macroValidator *
						pNext;
*/

void
mvl_init(MacroValidatorList	* out_pValidators)
{
	out_pValidators->pFirst = 0;
	out_pValidators->nextFreeIdentifier = 1;
}

void
mvl_destruct(MacroValidatorList	* out_pValidators)
{
	MacroValidator * pV = out_pValidators->pFirst;
	MacroValidator * pDel;
	for ( pDel = out_pValidators->pFirst;
		  pDel != 0;
		  pDel = pV )
	{
		pV = pV->pNext;

		pDel->pMacro->flag &= (~ISACTIVE);
		dofree(pDel);
	}
}


#define INVALID_TILL_ENDOFROW 32000

/*	If in_pTokenWhereMacroBecomesValid == 0, the macro is at row end
	and therefore there does not exist any token, where the macro becomes
	valid again. It is revalidated, when the row was processed complete.
*/
void
mvl_add( MacroValidatorList *	inout_pValidators,
		 Nlist *            	in_pMacro,
		 Token *				in_pTokenWhereMacroBecomesValid )
{

	MacroValidator * pNew = new(MacroValidator);
	pNew->pMacro = in_pMacro;

	if (in_pTokenWhereMacroBecomesValid == 0)
	{
		pNew->nTokenWhereMacroBecomesValid = INVALID_TILL_ENDOFROW;
	}
	else if (in_pTokenWhereMacroBecomesValid->identifier > 0)
	{
		pNew->nTokenWhereMacroBecomesValid = in_pTokenWhereMacroBecomesValid->identifier;
	}
	else
	{
		pNew->nTokenWhereMacroBecomesValid = inout_pValidators->nextFreeIdentifier;
		in_pTokenWhereMacroBecomesValid->identifier = inout_pValidators->nextFreeIdentifier;
		inout_pValidators->nextFreeIdentifier++;
	}

	pNew->pNext = inout_pValidators->pFirst;
	inout_pValidators->pFirst = pNew;
}

/*
void
mvl_move( MacroValidatorList * inout_pValidators,
		  int				   in_nSpace )
{
	MacroValidator * pV;
	for ( pV = inout_pValidators->pFirst;
		  pV != 0;
		  pV = pV->pNext )
	{
		pV->pTokenWhereMacroBecomesValid += in_nSpace;
	}
}
*/

void
mvl_check(	MacroValidatorList * inout_pValidators,
			Token *			     inout_pTokenToCheck)
{
	MacroValidator * pV;			/* Running pointer */
	MacroValidator * pCheckedOnes;  /* Here new list is built.  */
	pCheckedOnes = 0;

	for ( pV = inout_pValidators->pFirst;
		  pV != 0;
		  pV = inout_pValidators->pFirst )
	{
		inout_pValidators->pFirst = pV->pNext;

		if (pV->nTokenWhereMacroBecomesValid == inout_pTokenToCheck->identifier)
		{
			pV->pMacro->flag &= (~ISACTIVE);
			dofree(pV);
		}
		else
		{
			pV->pNext = pCheckedOnes;
			pCheckedOnes = pV;
		}
	}	/* end for  */

	/* Assign new built list (too old ones were removed) to
	   original list:
	*/
	inout_pValidators->pFirst = pCheckedOnes;
}


void
tokenrow_zeroTokenIdentifiers(Tokenrow* trp)
{
	Token * tp;
	for (tp = trp->bp; tp < trp->lp; tp++)
	{
		tp->identifier = 0;
	}
}

