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

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

#include "Indice.h"

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

/*--------------------------------------------------------------------
 * FUNCION:  Ind_IncrementaNivel()
 * OBJETIVO: Aumentar una unidad el nivel en el rbol de bsqueda
 * ENTRADAS: El ndice y la posicin relativa en el fichero de la 
 *           nueva pgina que hay que leer
 * SALIDAS:  Lgica, que indica si se ha podido incrementar el nivel
 * EJEMPLO:  Ind_IncrementaNivel ( Agenda, 2048 )
 * ALGORITMO:
 *      Aumentar una unidad el nivel
 *      Si alcanzamos el mximo nivel admitido
 *        Aumentar y anotar el nuevo mximo 
 *        Aumentar la memoria de Item y la de Posicion
 *        Si no se ha podido, hay error de memoria
 *      Si no hay error de memoria
 *        Anotar la posicin de la nueva pgina
 *        Leer la nueva pgina y devolver si se ha podido
 *      Si lo hay, devolver NO
 *------------------------------------------------------------------*/
logico Ind_IncrementaNivel (Indice,Posicion)
indice Indice;
entero Posicion;
  {
  memoria NuevoDirItem, NuevoDirPosicion;
  logico  ErrorMemoria = NO, Respuesta;
  
  Ind_PonNivel (Indice, Ind_Nivel(Indice) + 1);
  if ( Ind_Nivel(Indice) == Ind_MaxNivel(Indice) )
    {
    Ind_PonMaxNivel (Indice, Ind_MaxNivel(Indice) + IND_MINNIVEL);
    NuevoDirItem = Mem_Ajusta ( Ind_DirItem(Indice),
                                Ind_MaxNivel(Indice) * sizeof (contador) );
    NuevoDirPosicion = Mem_Ajusta ( Ind_DirPosicion(Indice),
                                    Ind_MaxNivel(Indice) * sizeof (entero) );
    if ( !NuevoDirItem || !NuevoDirPosicion )
      { ErrorMemoria = SI; }
    else
      {
      Ind_PonDirItem (Indice, (contador *) NuevoDirItem);
      Ind_PonDirPosicion (Indice, (entero *) NuevoDirPosicion);
      }  
    }
    
  if ( !ErrorMemoria )
    {
    Ind_PonPosicion (Indice,Posicion);
    Respuesta = Ind_LeePagina (Indice,Posicion);
    }
  else { Respuesta = NO; }
  
  return ( Respuesta );
  }