/*--------------------------------------------------------------------
 * FICHERO:  IndSigte.c
 * OBJETIVO: Definir la funcin Ind_Siguiente()
 * AUTOR:    Pedro Reina
 * FECHA:    X.2.8.1995
 *------------------------------------------------------------------*/

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

#include "Indice.h"

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Ind_Siguiente()
 * OBJETIVO: Dar el siguiente 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
 *           3. Si se llama a esta funcin inmediatamente
 *              despus de abrir el ndice, se devuelve
 *              Ind_Primero()
 * EJEMPLO:  Ind_Siguiente ( Agenda, &NumeroRegistro, Clave )
 * ALGORITMO:
 *      Si estamos fuera del rbol, devolver Ind_Primero()
 *      Incrementar Item
 *      Si apunta a otra pgina
 *        Repetir
 *          Incrementar el nivel bajando a la pgina calculada
 *          Poner el item a 0
 *          Ver la pgina a la que apunta
 *        Mientras exista la pgina
 *      Si apunta a la pgina actual (es decir, pgina 0)
 *        Si el item es mayor o igual que el mximo
 *          Hecho es NO
 *          Repetir
 *            Decrementar el nivel. Si no se puede, devolver NO
 *            Si el nmero de item es menor que el mximo, Hecho es SI
 *          Mientras Hecho sea NO
 *      Dar el nmero y la clave del item
 *------------------------------------------------------------------*/
logico Ind_Siguiente (Indice, Registro, Clave)
indice  Indice;
entero *Registro;
cadena  Clave;
  {
  logico Respuesta, Hecho, Error;
  entero NuevaPagina;
  
  if ( Ind_Nivel(Indice) == IND_FUERA ) 
    { return ( Ind_Primero (Indice, Registro, Clave) ); }

  Ind_IncrementaItem (Indice);
  Error = NO;
  
  if ( NuevaPagina = Ind_PaginaApuntada (Indice, Ind_Item(Indice)) )
    {
    do
      {
      Error = !Ind_IncrementaNivel (Indice, NuevaPagina);
      Ind_PonItem (Indice,0);
      NuevaPagina = Ind_PaginaApuntada (Indice,0);
      } while ( NuevaPagina && !Error );
    }
    
  else
    {
    if ( Ind_Item (Indice) >= Ind_MaxItem (Indice) )
      {
      Hecho = NO;
      do 
        {
        Error = !Ind_DecrementaNivel (Indice);
        Hecho = ( Ind_Item (Indice) < Ind_MaxItem (Indice) );
        } while ( !Hecho && !Error );
      }
    }  
  
  if ( !Error )
    {  
    *Registro = Ind_Registro (Indice,Ind_Item(Indice));
    Ind_Clave (Indice,Ind_Item(Indice),Clave);
    Respuesta = SI;
    }
  else { Respuesta = NO; }  
  
  return ( Respuesta );
  }