+\layout Standard
+
+Las funciones principales son las necesarias para completar la estructura
+ EMUFS (ver página
+\begin_inset LatexCommand \pageref{sub:EMUFS}
+
+\end_inset
+
+).
+\layout Subsection
+
+Lectura de registros
+\layout Standard
+
+Para leer un registro se hace uso del archivo de índice (ver página
+\begin_inset LatexCommand \pageref{sec:idx}
+
+\end_inset
+
+), obteniéndose el número de bloque en donde está almacenado el registro
+ a buscar.
+ Una vez obtenido, se carga en memoria el bloque entero y se busca secuencialmen
+te en él (leyendo la cabecera de cada registro y salteando los datos) hasta
+ encontrar el registro pedido.
+ Una vez encontrado se lo copia y devuelve.
+\layout Standard
+
+Si se tratara de un registro
+\emph on
+multibloque
+\emph default
+ (ver sección
+\begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
+
+\end_inset
+
+), se procede forma similar, sólo que se cargan en memoria uno a uno los
+ bloques que componen el registro y se van copiando (y uniendo) los
+\emph on
+fragmentos
+\emph default
+ hasta completarlo.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo1_leer_registro()
+\layout Subsection
+
+Altas de registros
+\layout Standard
+
+Para realizar el alta de un registro, lo primero que se obtiene es un identifica
+dor, buscando primero en el archivo de identificadores recuperables (pág.
+
+\begin_inset LatexCommand \ref{sec:did}
+
+\end_inset
+
+) y de no haber ninguno, buscando el mayor identificador presente en el
+ archivo de índice (pág.
+
+\begin_inset LatexCommand \ref{sec:idx}
+
+\end_inset
+
+) y sumándole uno.
+ El paso siguiente es buscar un bloque con espacio libre suficiente como
+ para almacenar el registro (y su cabecera) en el archivo de control de
+ espacio libre (pág.
+
+\begin_inset LatexCommand \ref{sec:fsc}
+
+\end_inset
+
+) y cargarlo completo en memoria.
+ De no encontrarse, se crea un bloque nuevo al final de archivo.
+ En el bloque cargado en memoria, se agrega el registro nuevo (con su cabecera)
+ al comienzo del espacio libre (calculado a partir del tamaño del bloque
+ y el espacio libre en bloque) y se lo graba en disco.
+ Finalmente se agrega (o actualiza) el identificador al archivo índice y
+ el espacio libre en el bloque.
+\layout Standard
+
+Si el registro ocupara más de un bloque (ver sección
+\begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
+
+\end_inset
+
+), se buscan N bloques consecutivos (todos los que necesite el registro)
+ absolutamente libres
+\begin_inset Foot
+collapsed true
+
+\layout Standard
+
+Incluso el último bloque debe estar absolutamente libre para cumplir con
+ las condiciones presentadas en la sección
+\begin_inset LatexCommand \ref{sub:tipo1_reg_multi}
+
+\end_inset
+
+.
+\end_inset
+
+ y graba bloque a bloque cada
+\emph on
+fragmento
+\emph default
+ del registro (con sus cabeceras intermedias), al último
+\emph on
+fragmento
+\emph default
+ se lo trata de forma análoga a un registro
+\emph on
+simple
+\emph default
+.
+ Por cada bloque utilizado se actualiza el archivo de control de espacio
+ libre.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo1_agregar_registro()
+\layout Subsection
+
+Bajas de registros
+\layout Standard
+
+Al eliminar un registro lo primero que se hace es actualizar los archivos
+ de índice y de indentificadores recuperables, poniendo como número de bloque
+ el valor especial
+\family typewriter
+EMUFS_NOT_FOUND
+\family default
+ y agregando el identificador del registro a borrar respectivamente.
+ También se actualiza el archivo de control de espacio libre por cada bloque
+ (en caso de ser más de uno, en registros
+\emph on
+multibloque
+\emph default
+, se actualizan todos los bloques) y se carga el bloque en memoria para
+
+\emph on
+alinear los datos a izquierda
+\emph default
+ (en caso de ser un registro
+\emph on
+multibloque
+\emph default
+, esto se realiza sólo para el último bloque).
+ Para alinear los datos, se recorre secuencialmente en bloque (leyendo la
+ cabecera de cada registro y salteando los datos) hasta encontrar el registro
+ a borrar.
+ Encontrado el registro, se copian todos los bytes que se encuentran entre
+ el fin del registro a borrar y el fin del bloque, en el comienzo del bloque
+ borrado.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo1_borrar_registro()
+\layout Subsection
+
+Modificación de registros
+\layout Standard
+
+Se optó por un algoritmo simple y general, que usa las funciones de alto
+ nivel mencionadas hasta ahora.
+ Simplemento borra el registro y vuelve a crearlo.
+ Al recuperar el último identificador de registro borrado, nos aseguramos
+ de que se mantenga el identificador del registro.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo1_modificar_registro()
+\layout Subsection
+
+Obtención de estadísticas
+\layout Standard
+
+Es una función bastante simple, con una única complicación que mencionaremos
+ más adelante.
+\layout Standard
+
+Para obtener las máximas desviaciones, cantidad total de espacio libre,
+ cantidad de registros y tamaño de los archivos auxiliares se utilizan las
+ funciones apropiadas de los archivos auxiliares (ver secciones
+\begin_inset LatexCommand \ref{sec:idx}
+
+\end_inset
+
+,
+\begin_inset LatexCommand \ref{sec:fsc}
+
+\end_inset
+
+ y
+\begin_inset LatexCommand \ref{sec:did}
+
+\end_inset
+
+).
+\layout Standard
+
+Para obtener la cantidad de bloques se hace el siguiente calculo:
+\layout LyX-Code
+
+cant_bloques = (tamaño_archivo_datos - tamaño_cabecera_archivo_datos)
+\layout LyX-Code
+
+ / tamaño_bloque;
+\layout Standard
+
+Hasta aquí no hay mayores inconvenientes.
+ El problema se presenta para calcular el tamaño de la información de control
+ utilizada por el archivo de datos; se utiliza el siguiente cálculo:
+\layout LyX-Code
+
+tam_info_control_datos = tamaño_cabecera_archivo_datos
+\layout LyX-Code
+
+ + cant_registros * tamaño_cabecera_registro;
+\layout Standard
+
+Aunque a simple vista esto parece acertado, no contempla el caso de los
+ registros
+\emph on
+multibloque
+\emph default
+ (pág
+\begin_inset LatexCommand \pageref{sub:tipo1_reg_multi}
+
+\end_inset
+
+), estos registros almacenan
+\family typewriter
+tamaño_cabecera_registro * N
+\family default
+, donde
+\family typewriter
+N
+\family default
+ es la cantidad de bloques que ocupan.
+ Salvar este caso sería muy costoso, porque habría que recorrer el archivo
+ registro a registro,
+\emph on
+fragmento
+\emph default
+ a
+\emph on
+fragmento
+\emph default
+ e ir contando todas las cabeceras de registro que aparecen (similar a lo
+ que se hace en la compactación, ver sección
+\begin_inset LatexCommand \ref{sub:tipo1_compact}
+
+\end_inset
+
+).
+ Al tratarse este de un caso excepcional, se optó por mantener la función
+ simple ya que funciona bien en la mayoría de los casos.
+\layout Standard
+
+Ver:
+\family typewriter
+emufs_tipo1_leer_estadisticas()
+\layout Subsection
+
+
+\begin_inset LatexCommand \label{sub:tipo1_compact}
+
+\end_inset
+
+Compactación del archivo de datos
+\layout Standard
+
+Esta función es una de las más simples, porque se limita a un algoritmo
+ muy simple que utiliza las funciones de
+\emph on
+alto nivel
+\emph default
+ antes nombradas para realizar su tarea.
+ Básicamente recorre el archivo de índices de registros, de comienzo a fin,
+ leyendo el registro, borrándolo y volviéndolo a insertar.
+ Si había espacio libre en un bloque anterior al que estaba, será insertado
+ en él, si no volverá a grabarse en el lugar en que estaba.
+ De esta forma se aprovechan todos los espacios libres intermedios, concluyendo
+ con un archivo igual o más pequeño que el original.
+\layout Standard
+
+Esta implementación no es la más eficiente, pero siendo que esta es una
+ operación costosa y excepcional por naturaleza, se optó por mantener el
+ algoritmo simple a costo de un poco de eficiencia.
+\layout Standard
+
+Ver:
+\family typewriter
+ emufs_tipo1_compactar()