#include "defs.h"

Prototype MoveHderB(WORD oB,WORD nB,WORD *datafree,WORD UDB[],WORD *i);


/*	MoveHderB déplace le Header spécifié du bloc lB au bloc nB.
	nB: nouveau n° de bloc.
	oB: ancien  n° de bloc.
*/

MoveHderB(oB,nB,datafree,UDB,i)
WORD oB,nB,*datafree;
WORD UDB[],*i;
{
struct SFileHderB  *dlistB,*fhB;
struct FileHeaderB *adr;
struct DiskList	   *hdb;
struct FileHeaderB *adrh;
struct  DataB       *AdrD;
WORD   n,ret,ext,bloc,*nflB;
WORD   gfree;
BYTE   first;
#ifdef DEBUG
	printf("in MoveHderB() oB: %d, nB: %d,datafree: %d\n",oB,nB,*datafree);
#endif
	dlistB=whereB(oB);
	if (dlistB==0) NotSet(oB,4);
	else
	{
		if (dlistB->dl_Type!=-1) return(0);
		adr=(struct FileHeaderB *)dlistB->dl_AdrB;
			/* On change le HeaderKey du bloc */
		adr->HeaderKey=nB;
		dlistB->dl_Bloc2=nB;

			/* On change tous les DatasB en conséquence */
		gfree=nB+1;
		first=1;

		for (n=71;n!=-1;n--)
		{	
			if (adr->DataTable[n])
			{
				if ( (dlistB->dl_Data==1) && (CLI==0) ) /* bloc de data ds gestion */
				{
					AdrD=ModifyDataHder((WORD)adr->DataTable[n],nB,gfree,adr->HeaderKey);
					adr->DataTable[n]=gfree;
					if (first) {adr->FirstDataB=gfree; first=0;}

					gfree++;
					if (n) ModifyDataNext(AdrD,gfree);
					else ModifyDataNext(AdrD,gfree+1);
				}
				else
				{
					AdrD=ModifyDataHder(adr->DataTable[n],nB,*datafree,adr->HeaderKey);
					adr->DataTable[n]=*datafree;
					if (first) {adr->FirstDataB=*datafree; first=0;}

					Inc(datafree);
					if (n) ModifyDataNext(AdrD,*datafree);
					else
					{
						if (FLnog) ModifyDataNext(AdrD,Nextdfree(datafree));
						else ModifyDataNext(AdrD,*datafree);
					}
				}

			}
		}

		if (adr->Extension) 
		{
			if (FLnog) 
			{
				nflB=datafree;
				ext=*datafree;
			}	
			else
			{
				nflB=&gfree;
				ext=gfree;
			}
			if (CLI)	/* pas de .info dans les blocs de gestion */
			{
				ModifyFList(adr->Extension,nB,nflB,datafree,0);
			}
			else
			if (dlistB->dl_Data==1) /* si .info alors ds les blocs de gestion */
			{
				ModifyFList(adr->Extension,nB,nflB,&gfree,1);
			}
			else
			{
				ModifyFList(adr->Extension,nB,nflB,datafree,0);
			}
			adr->Extension=ext;
		}


	}
	return(gfree);
}
