#include "defs.h"

Prototype struct DataB *ModifyDataHder(WORD bloc,WORD nfhB,WORD ndataB,LONG fh);
Prototype ModifyDataNext(struct DataB *adr,WORD ndataNext);
Prototype ModifyFList(WORD bloc,WORD nfhB,WORD *nflB,WORD *datafree,WORD data);


struct DataB *ModifyDataHder(bloc,nfhB,ndataB,fh)
WORD bloc,nfhB,ndataB;
LONG fh;
{
struct SDataB *dlistD;
struct DataB  *adr;

#ifdef DEBUG
	fprintf(FPointer,"in MofifyDataHder() bloc: %d, nfhB : %d, ndataB: %d\n",bloc,nfhB,ndataB);
#endif
	dlistD=whereB(bloc);
	if (dlistD==0) {NotSet(bloc,fh); exit(0);}
	else
	dlistD->dl_Bloc2=ndataB;

	dlistD->dl_type8.dl_FileHeader=nfhB;
	adr=dlistD->dl_AdrB;
	if (FFS==0) adr->HeaderKey=nfhB;
	return(adr);
}

ModifyDataNext(adr,ndataNext)
struct DataB *adr;
WORD ndataNext;
{
	if (FFS==0)
	{if (adr->NextDataBlock)	adr->NextDataBlock=ndataNext;}

}

/* Renvoie n° du prochain bloc libre */

ModifyFList(bloc,nfhB,nflB,datafree,data)
WORD bloc,nfhB,*nflB,*datafree,data;
{
struct SFileListB *dlistFL;
struct FileListB  *adr;
LONG   *AdrD;
WORD   n,ret=0,ext;
BYTE   first;
#ifdef DEBUG
	printf("in MofifyFList() bloc: %d, nfhB : %d, nflB: %d,datafree: %d\n",bloc,nfhB,*nflB,(*datafree)+1);
#endif
	dlistFL=whereB(bloc);
	if (dlistFL==0) NotSet(bloc,5);
	else
	{
		/*printf(" Type du bloc: %d\n",dlistFL->dl_Type);*/
		dlistFL->dl_type13.dl_FileHeader=nfhB;
		dlistFL->dl_Bloc2=*nflB;
		adr=(struct FileListB *)dlistFL->dl_AdrB;
		adr->ParentFH=nfhB;
		adr->HeaderKey=*nflB;
		if (FLnog) Inc(nflB); else (*nflB)++;
		
		first=1;
		for (n=71;n!=-1;n--)
		{
			if(adr->DataTable[n])
			{
				AdrD=ModifyDataHder(adr->DataTable[n],nfhB,*datafree,bloc);
				adr->DataTable[n]=*datafree;
				if (first) {adr->FirstDataB=*datafree; first=0;}

				if (data==0) Inc(datafree); else (*datafree)++;

				if (n)
				{
					if (data==0) ModifyDataNext(AdrD,*datafree);
					else ModifyDataNext(AdrD,*datafree+1);
				}
				else
				{
					if (FLnog) ModifyDataNext(AdrD,Nextdfree(datafree));
					else ModifyDataNext(AdrD,*datafree);
				}
			}
		}

		ext=*nflB;
		if (adr->Extension) 
		{
			ret+=ModifyFList(adr->Extension,nfhB,nflB,datafree,data);
			adr->Extension=ext;
			return(++ret);
		}

		return(ext);
	}
}
