#ifndef __SFBASICO_H
#define __SFBASICO_H

/*								*/
/*	SFBASICO.H						*/
/*	==========						*/
/*								*/
/*	Interfaz con el Sistema de Ficheros Básico		*/
/*								*/


/* Tipos básicos de las prácticas */

#include "tipos.h"



/**************************/
/*  Constantes y límites  */
/**************************/

/*								*/
/* Según se tenga asignación de espacio contigua o no 		*/
/*								*/
/* 	Si está definido CONTIGUO, el sistema de ficheros	*/
/*	extendido puede tenerlo en cuenta a la hora de al-	*/
/*	terar el tamaño de los ficheros				*/
/*								*/

#define NO_CONTIGUO
/*#define CONTIGUO*/


/* Máximo número de bloques contiguos que se pueden		*/
/* solicitar para hacer crecer un fichero			*/
#define MAX_BLOQUES_CONTIGUOS	1

/* Máximo número de ficheros posible 				*/
#define MAX_FICHEROS	20000




/******************/
/* Tipos de datos */
/******************/


/* Índice a fichero básico */
typedef unsigned short IFB;



/****************************/
/* Servicios de este módulo */
/****************************/



/* Formateo y montaje de discos */

int FormateaSFB ( const char* nombre_fichero,
		  WORD BF_reservados, WORD tam_DFE,
		  WORD tam_bloque_datos, WORD num_ficheros );

int MontaSFB ( const char* nombre_fichero, int nbloques_cache );
int DesmontaSFB (void);



/* Par metros del sistema */

WORD TamBloqueDatos(void);



/* Creación y destrucción de ficheros */

IFB CreaFB ( WORD num_bloques );
int DestruyeFB ( IFB fichero );


/* Tamaño del fichero */

WORD LongitudFB ( IFB fichero );
int ExpandeFB ( IFB fichero, WORD num_bloques );
int TruncaFB ( IFB fichero, WORD num_bloques );


/* Lectura y escritura de bloques */

int LeeBloqueFB ( IFB fichero, WORD num_bloque, void* bufer );
int EscribeBloqueFB ( IFB fichero, WORD num_bloque, void* bufer );


/* Acceso al descriptor de fichero de extendido */

int LeeDFE ( IFB fichero, void* estructura );
int EscribeDFE ( IFB fichero, void* estructura );


/* Gestión elemental de los bloques de datos */

DWORD ReservaBloqueDatos (void);
int LiberaBloqueDatos ( DWORD bloque );

/* Funciones sólo implementadas en asignaciones contiguas */

DWORD ReservaSegmentoDatos ( DWORD num_bloques );
int LiberaSegmentoDatos ( DWORD bloque_inicial, DWORD num_bloques );