/* Conjunto de utilidades */

#include "Tipos_SF.h"
#include "sfsimb.h"

char nombre[25];
char buff[512];
void (*f[25])();

extern int Error_SF;


main() {

	int ret, opcion;
	void crea_sistema(), salir(), monta(), desmonta(), crea_fichero();
	void apertura(), cierre(), posiciona(), lee(), escribe(), instala();
	void borra_fichero(), informe();

	f[0] = salir;
	f[1] = crea_sistema;
	f[2] = monta;
	f[3] = desmonta;
	f[4] = apertura;
	f[5] = cierre;
	f[6] = posiciona;
	f[7] = lee;
	f[8] = escribe;
	f[9] = informe;
	f[10] = instala;
	f[11] = crea_fichero;
	f[12] = borra_fichero; 

	do {
		printf("\nOPCIONES BASICAS:\n");
		printf("   0 ... Salir\n");
		printf("   1 ... Crear sistema de ficheros\n");
		printf("   2 ... Montar sistema de ficheros\n");
		printf("   3 ... Desmontar sistema de ficheros\n");
		printf("   4 ... Abrir fichero\n");
		printf("   5 ... Cerrar fichero\n");
		printf("   6 ... Posicionar puntero a fichero\n");
		printf("   7 ... Leer fichero\n");
		printf("   8 ... Escribir fichero\n");
		printf("   9 ... Estado del sistema\n");
		printf("  10 ... Instalacion de disco\n");
		printf("  11 ... Creacion de fichero\n");
		printf("  12 ... Borrado de fichero\n");

		scanf("%d",&opcion);
		if ( (opcion < 0) || (opcion > 13) ) continue;
		else  (*f[opcion])(); 
	} while(1);

}


void salir() {
	printf("\n Se ha pulsado salir");
	exit(0);
}


void  crea_sistema() {

	paramfs br, bd, lb, nf;

	printf("\n Nombre del archivo: ");
	scanf("%s",nombre);
	printf("\n Bloques reservados: ");
	scanf("%hu",&br);
	printf("\n Longitud de bloque de datos: ");
	scanf("%hu",&lb);
	printf("\n Numero de ficheros: ");
	scanf("%hu",&nf);

	printf("\n Creando sistema .... ");
	if ( Crea_Sistema(nombre, br, lb, nf) < 0 ) printf("ERROR !!\n");
	else printf("SISTEMA CREADO\n");

	return;

}  


void monta() {

	int nbc;

	printf("\n Nombre del archivo: ");
	scanf("%s",&nombre);
	printf("\n Numero de bloques de cache: ");
	scanf("%d",&nbc);

	printf("\n Montando sistema .... ");
	if ( Activa_Sistema( nombre, nbc ) < 0 ) printf("ERROR !!\n");
	else printf(" SISTEMA MONTADO\n");

	return;

}


void desmonta() {

	printf("\n Desmontando sistema .... ");
	if ( Desactiva_Sistema() < 0 ) printf("ERROR !!\n");
	else printf(" SISTEMA DESMONTADO\n");

	return;

}


void apertura() {

	int ret ;
	int a;

	printf("\n Nombre del fichero: ");
	scanf("%s",nombre);
	printf("\n Acceso: ");
	scanf("%d",&a);

	ret = Abre_Fichero((Nombre)nombre,(char)a);
	if ( ret < -1 )
	printf("\n Error al abrir: %d\n",Error_SF);
	else
	printf("\n Descriptor: %d",ret);

	return;

}


void cierre() {

	int fd, ret;

	printf("Descriptor del fichero a cerrar: ");
	scanf("%d",&fd);

	ret = Cierra_Fichero( fd );
	if ( ret >= 0 )  printf("\n Archivo cerrado\n" );
	else printf("\n ERROR: %d",Error_SF);

	return;

}


void  posiciona() {

	int fd, ret;
	Posfich pos;

	printf("Descriptor del fichero a cerrar y posicion: ");
	scanf("%d %d",&fd,&pos);
	
	ret = Posiciona_Puntero( fd, pos );
	if ( ret > -1 ) printf("\n Puntero .... %d\n",ret);
	else  printf("\n ERROR: %d\n", Error_SF);

	return;

}


void lee() {

	int fd, nbytes, ret;
	char p;

	do {
		printf("Descriptor de fichero y bytes a leer (<512): ");
		scanf("%d %d",&fd, &nbytes);
		if ( !nbytes ) return;
		if ( nbytes <= 512 ) {
			printf("\n Leyendo fichero ....");
			ret = Lee_Fichero(fd, buff, nbytes);
			p = buff[nbytes];
			buff[nbytes] = '\0';
			if ( ret > -1 ) printf("  %s\n",buff);
                        else printf("\n ERROR: %d\n",Error_SF);
			buff[nbytes] = p;
			return;
		}
		printf("\n");
	} while (1);

}


void escribe() {

	int fd, nbytes, ret;

	do {
		printf("Descriptor de fichero y bytes a escribir (<512): ");
		scanf("%d %d",&fd,&nbytes);
		if ( !nbytes ) return;
		if ( (nbytes) >0 && (nbytes<=512) ) {
			scanf("%s",buff);
			ret = Escribe_Fichero(fd, buff, nbytes);
			if ( ret > -1 ) printf(" %d\n", ret);
			else printf("\n ERROR: %d\n", Error_SF);
			return;
		}
		printf("\n");
	} while(1);

}


void instala() {

	int ret;
	ret = InstalaDisco( "MI_DISCO", 512, 2048 );
	printf("\n InstalaDisco ha retornado %d\n",ret);

}


void crea_fichero() {

	int ret;
	int atrib;

	printf("Nombre del fichero a crear: ");
	scanf("%s",nombre);

	printf("\n Atributos de acceso: ");
	scanf("%d",&atrib);

	ret = Crea_Fichero( (Nombre)nombre, (char)atrib );

	if ( ret < 0 ) printf(" ERROR: %d\n",Error_SF);

}


void borra_fichero() {

	int ret;

	printf("Nombre del fichero a borrar: ");
	scanf("%s",nombre);

	ret = Borra_Fichero( (Nombre)nombre );
	printf("\n Valor retornado: %d\n", ret);
	if ( ret < 0 ) printf(" ERROR: %d\n",Error_SF);

}


void informe() {
	void Informe();

	Informe();
}