/*--------------------------------------------------------------------
 * FICHERO:  IndAbre.c
 * OBJETIVO: Definir la funcin Ind_Abre()
 * AUTOR:    Pedro Reina
 * FECHA:    D.30.7.1995
 *------------------------------------------------------------------*/

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

#include "Indice.h"

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Ind_Abre()
 * OBJETIVO: Abrir un fichero de ndices 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 indice o NIL si no se puede crear
 * EJEMPLO:  Ind_Abre ("Agenda.ntx", IND_LECTURA)
 * ALGORITMO:
 *      Pedir un objeto indice
 *      Abrir el fichero
 *      Anotar fichero y modo de apertura
 *      Leer cabecera
 *      Calcular y anotar la longitud de la clave
 *      Calcular y anotar la posicin de la pgina raz
 *      Poner el nivel en IND_FUERA, indicando que no estamos en 
 *            ninguna posicin del rbol
 *------------------------------------------------------------------*/
indice Ind_Abre (NombreFichero, Modo)
cadena NombreFichero;
octeto Modo;
  {
  indice   Nuevo;
  logico   ErrorFormato = NO, ErrorFichero = NO;
  contador LongClave, ClavesPagina;
  entero   PosicionRaiz;
  fichero  Fichero;
  cadena   Mensaje;

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

    if ( !Fichero )
      { ErrorFichero = SI; }
    else
      {
      Ind_PonFichero (Nuevo, Fichero);
      Ind_PonModoApertura (Nuevo, Modo);

      if ( !Ind_LeePagina (Nuevo, (entero)0) ) 
        { ErrorFormato = SI; }
      else
        {
        if ( Ind_Pagina(Nuevo)[0] != 0x06 ||  /* Hay que comprobar */
             Ind_Pagina(Nuevo)[1] != 0x00 ||  /* ms cosas */
             Ind_Pagina(Nuevo)[2] != 0x01 || 
             Ind_Pagina(Nuevo)[3] != 0x00 )
          { ErrorFormato = SI; }
        else
          {
          LongClave = Mem_LeeContador(Ind_Pagina(Nuevo)+14, MEM_INTEL);
          Ind_PonLongitudClave (Nuevo,LongClave);
          ClavesPagina = Mem_LeeContador(Ind_Pagina(Nuevo)+18, MEM_INTEL);
          Ind_PonClavesPagina (Nuevo,ClavesPagina);
          PosicionRaiz = Mem_LeeEntero (Ind_Pagina(Nuevo)+4, MEM_INTEL);
          Ind_PonPosicion (Nuevo,PosicionRaiz);
          Ind_PonNivel(Nuevo,IND_FUERA);
          }
        }
      }
    }

  if ( ErrorFormato )
    {
    Mensaje = Cad_Une ("El fichero \"",NombreFichero,"\" no tiene formato ",
                       "correcto", CAD_FIN);
    Usr_Avisa (Mensaje);
    Cad_Destruye (Mensaje);
    }

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

  return ( Nuevo );
  }