/*--------------------------------------------------------------------
 * FICHERO:  IndPrime.c
 * OBJETIVO: Definir la funcin Ind_Primero()
 * AUTOR:    Pedro Reina
 * FECHA:    M.1.8.1995
 *------------------------------------------------------------------*/

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

#include "Indice.h"

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Ind_Primero()
 * OBJETIVO: Dar el primer 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_Primero ( 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 0
 *          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 0 
 *------------------------------------------------------------------*/
logico Ind_Primero (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,0);
      if ( NuevaPagina = Ind_PaginaApuntada (Indice,0) )
        { Error = ! ( Ind_IncrementaNivel (Indice, NuevaPagina) ); }
      else { SigueBajando = NO; }  
      }
    if ( ! Error )
      {  
      Ind_PonItem (Indice,0);
      *Registro = Ind_Registro (Indice,0);
      Ind_Clave (Indice,0,Clave);
      Respuesta = SI;
      }
    else { Respuesta = NO; }  
    }
  
  return ( Respuesta );
  }