/************************************************************************/ /* */ /* FUNCIONES MIEMBROS DEL TIPO BFB */ /* IMPLEMENTACIÓN */ /* */ /************************************************************************/ #include "bfb.h" #include "descr.h" #include "errores.h" #include "sffisico.h" #include #include #include 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); }