/*--------------------------------------------------------------------
 * FICHERO:  MmoAbre.c
 * OBJETIVO: Definir la funcin Mmo_Abre()
 * AUTOR:    Pedro Reina
 * FECHA:    V.14.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "Memo.h"

/*--------------------------------------------------------------------
 * Definicin de funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Definicin de macros constantes
 *------------------------------------------------------------------*/

#define MMO_CABECERAMIN 22

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Mmo_Abre()
 * OBJETIVO: Abrir un fichero memo y obtener un objeto en
 *           memoria para manejarlo
 * ENTRADAS: El nombre completo del fichero que hay que abrir,
 *           y el modo de apertura
 * SALIDAS:  Un objeto memo o NIL si no se puede crear
 * EJEMPLO:  Mmo_Abre ("Agenda.dbt", MMO_LECTURA)
 * ALGORITMO:
 *      Pedir un objeto memo
 *      Abrir el fichero
 *      Anotar fichero y modo de apertura
 *      Leer la mnima cabecera necesaria
 *      Calcular y anotar el bloque disponible
 *      Reservar memoria para Dato y anotarlo
 *------------------------------------------------------------------*/
memo Mmo_Abre (NombreFichero, Modo)
cadena NombreFichero;
octeto Modo;
  {
  memo    Nuevo;
  logico  ErrorFormato = NO, ErrorMemoria = NO, ErrorFichero = NO;
  entero  Disponible;
  memoria Dato;
  octeto  Aux[MMO_CABECERAMIN];
  fichero Fichero;

  if ( Nuevo = Mmo_CreaObjeto() )
    {
    if ( Modo == MMO_LECTURA )
      { Fichero = Fch_AbreLeer (NombreFichero,FCH_BINARIO); }
    else
      { Fichero = Fch_AbreActualizar (NombreFichero,FCH_BINARIO); }

    if ( !Fichero )
      { ErrorFichero = SI; }
    else
      {
      Mmo_PonFichero (Nuevo, Fichero);
      Mmo_PonModoApertura (Nuevo, Modo);

      if ( !Fch_LeeOcteto (Fichero, Aux, MMO_CABECERAMIN) )
        { ErrorFormato = SI; }
      else
        {
        Disponible = Mem_LeeEntero (Aux, MEM_INTEL);
        Mmo_PonDisponible (Nuevo, Disponible);
 
        Dato = Mem_Crea (MMO_TAMANOBLOQUE);
        if ( !Dato ) { ErrorMemoria = SI; }
        else         { Mmo_PonDato (Nuevo, Dato); }
        }
      }
    }
    
  else  { ErrorMemoria = SI; }


  if ( ErrorMemoria || ErrorFormato || ErrorFichero )
    {
    Mmo_Destruye (Nuevo);
    Nuevo = NIL;
    }

  return ( Nuevo );
  }