/*--------------------------------------------------------------------
 * FICHERO:  IndUltim.c
 * OBJETIVO: Definir la funcin Ind_Ultimo()
 * AUTOR:    Pedro Reina
 * FECHA:    J.13.7.1995
 *------------------------------------------------------------------*/

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

#include "Indice.h"

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Ind_Ultimo()
 * OBJETIVO: Dar el ltimo ndice de un fichero de ndices
 * ENTRADAS: El ndice, una variable en la que dejar el nmero
 *           de registro del ndice encontrado y una cadena
 *           donde dejar la clave
 * SALIDAS:  Lgica, que indica si se ha podido encontrar; 
 *           la variable y la cadena quedan modificadas
 * NOTAS:    1. Los registros se numeran a partir de 0
 *           2. La cadena debe ser suficientemente larga
 *              como para recibir la clave, sin olvidar
 *              el espacio para el NULO
 * EJEMPLO:  Ind_Ultimo ( Agenda, &NumeroRegistro, Clave )
 * ALGORITMO:
 *      Colocarse en el nivel IND_FUERA, fuera del rbol
 *      Bajar al nivel 0, la raz del rbol
 *      Si ah no hay claves, la respuesta es NO
 *      Si hay alguna clave
 *        Mientras se pueda
 *          Poner el item a MaxItem
 *          Si apunta a alguna pgina, bajar un nivel a la pgina indicada
 *          Si no apunta a ninguna pgina, no se puede ms
 *        Dar el registro y la clave del item MaxItem-1
 *------------------------------------------------------------------*/
logico Ind_Ultimo (Indice, Registro, Clave)
indice  Indice;
entero *Registro;
cadena  Clave;
  {
  logico Respuesta, SigueBajando, Error;
  entero NuevaPagina;
  
  Ind_PonNivel (Indice, IND_FUERA);
  Ind_IncrementaNivel (Indice, Ind_DirPosicion(Indice)[0]);
  
  if ( ! Ind_MaxItem (Indice) ) { Respuesta = NO; }
  else
    {
    SigueBajando = SI;
    Error = NO;
    while ( SigueBajando && !Error )
      {
      Ind_PonItem (Indice,Ind_MaxItem(Indice));
      if ( NuevaPagina = Ind_PaginaApuntada (Indice,Ind_MaxItem(Indice)) )
        { Error = ! ( Ind_IncrementaNivel (Indice, NuevaPagina) ); }
      else { SigueBajando = NO; }  
      }
    if ( ! Error )
      {  
      Ind_PonItem (Indice,Ind_MaxItem(Indice)-1);
      *Registro = Ind_Registro (Indice,Ind_Item(Indice));
      Ind_Clave (Indice,Ind_Item(Indice),Clave);
      Respuesta = SI;
      }
    else { Respuesta = NO; }  
    }
  
  return ( Respuesta );
  }