/************************************************************************/
/*									*/
/*			FUNCIONES MIEMBROS DEL TIPO BFB			*/
/*				IMPLEMENTACIÓN				*/
/*									*/
/************************************************************************/

#include "bfb.h"
#include "descr.h"
#include "errores.h"
#include "sffisico.h"

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


static char* BUFER;



void BFB_empieza_sesion (void)
{
  assert (DESC.montado!=0);
  assert (DESC.tam_bloque_fisico>0);

  BUFER = (char*)malloc(DESC.tam_bloque_fisico);

  assert(BUFER!=0);
}



void BFB_termina_sesion (void)
{
  assert(BUFER!=0);
  free(BUFER);
}


/* Función BFB_calcula (ifb,&bloque,&desplaz)			*/
/*								*/
/*	Calcula el bloque físico y el desplazamiento dentro	*/
/*	del bloque donde se halla el bloque referenciado por	*/
/*	el parámetro "ifb". El bloque y el desplazamiento se	*/
/*	devuelven mediante los parámetros "bloque" y "desplaz". */	



void BFB_calcula ( IFB fichero, DWORD* bloque, WORD* desplaz )
{
	assert (bloque!=0);
	assert (desplaz!=0);

	if ( fichero==NINGUN_IFB || fichero>DESC.num_BFB )
	  Error_SF = ERR_RANGO;
	else {
	  *bloque = DESC.org_BFB + fichero/DESC.BFBs_por_BF;
	  *desplaz = (fichero % DESC.BFBs_por_BF) * TAM_BFB;
	}
}



/* Función BFB_recoge (bfb,ifb)					*/
/*								*/
/*	Recoge los datos de un BFB desde el disco		*/
/*	Lee el bloque físico correspondiente, selecciona el	*/
/*	fragmento donde está el BFB, y lo copia en "bfb"	*/



void BFB_recoge ( BFB* bfb, IFB ifb )
{
	DWORD bloque;
	WORD desplaz;

	assert (bfb!=0);

	BFB_calcula (ifb,&bloque,&desplaz);
	if (HAY_ERROR) return;
                        
	LeeBloqueFisico (bloque,BUFER);
	if (HAY_ERROR) return;

	memcpy( bfb, BUFER+desplaz, TAM_BFB );
}



/* Función BFB_guarda (bfb,ifb)					*/
/*								*/
/*	Guarda los datos de un BFB en el disco			*/
/*	Lee el bloque físico correspondiente, lo modifica y	*/
/*	lo vuelve a guardar modificado.				*/



void BFB_guarda ( const BFB* bfb, IFB ifb )
{
	DWORD bloque;
	WORD desplaz;

        assert(bfb!=0);

	BFB_calcula(ifb,&bloque,&desplaz);
	if (HAY_ERROR) return;

	LeeBloqueFisico(bloque,BUFER);
	if (HAY_ERROR) return;

	memcpy ( BUFER+desplaz, bfb, TAM_BFB );

	EscribeBloqueFisico (bloque,BUFER);
}