#include "defs.h"

Prototype arrange(WORD UDB[],WORD *i);

arrange(UDB,i)
WORD UDB[],*i;
{
static WORD gfree=882,dfree=2;
struct SUserDirB *udbf,*udbp,*fhB;
struct UserDirB  *adrf;
struct UserDirB  *adrp;
/*struct DiskList	 *hdb;*/
struct FileHeaderB *adrh;
WORD   UDBP,n,bloc,parent;

	if (INIT & ARRANGE)
	{
		gfree=882; dfree=2;
		INIT &= ~ARRANGE;
	}

	/*printf("in arrange() UDB[0] : %d, i : %d\n",UDB[0],*i);*/
	udbf=whereB(UDB[0]);
	if (udbf==0) {NotSet(UDB[0],0); return(0);}

	for (n=0;n<*i;n++) UDB[n]=UDB[n+1];	/* On s' occuppe de UDB[0] donc on le retire de la liste */
	UDB[*i]=0;
	(*i)--;

	UDBP=udbf->dl_type4.dl_Parent;

	if (UDBP)	/* null si Root */
	{
		udbp=whereB(UDBP);
		if (udbp==0) {NotSet(UDBP,1); return(0);}
	}

	adrf=udbf->dl_AdrB;
/*	printf("adrf : %p\n",adrf);*/

	if (UDBP)	/* Cas du User Dir B */
	{
		adrp=udbp->dl_AdrB;
		adrf->ParentDir=udbp->dl_Bloc;	/* Les Parents sont tjs déplacés avt */
	/*printf("Parent: %d\n",adrf->ParentDir);*/
	}

	for (n=71;n!=-1;n--)
	{
	
		bloc=adrf->HashTable[n];
		if (bloc)
		{
			adrf->HashTable[n]=gfree;
			do
			{
				fhB=whereB(bloc);
				if (fhB==0) {NotSet(bloc,2); break;}

				if (fhB->dl_Type==-1)
				{
					gfree=MoveHderB(bloc,gfree,&dfree,UDB,i);
				}
				else
				if (fhB->dl_Type==4)
				{
					gfree=MoveUserDirB(bloc,gfree);
					UDB[(*i)++]=bloc;
					UDB[*i]=0;
				}

				adrh=(struct FileHeaderB *)fhB->dl_AdrB;
				bloc=adrh->NextHash;
				adrh->NextHash= (bloc ? gfree : 0);
				/*printf("adrh: %p,bloc: %d\n",adrh,bloc);*/
			}
			while (bloc);
		}
	}
	/*printf("gfree: %d dfree: %d\n",gfree,dfree);*/
	GFree=gfree;
	DFree=dfree;
	return(1);
}

