/*--------------------------------------------------------------------
 * FICHERO:  Vind.c
 * OBJETIVO: Probar el objeto Indice
 * AUTOR:    Pedro Reina
 * FECHA:    V.4.8.1995
 *------------------------------------------------------------------*/

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

#include "Azar.h"        /* Para las comprobaciones */
#include "BaseDato.h"    /* Para las comprobaciones */
#include "Indice.h"

/*--------------------------------------------------------------------
 * Declaracin de funciones
 *------------------------------------------------------------------*/

void P_Ind_Abre();
void P_Ind_Primero();
void P_Ind_Ultimo();
void P_Ind_Siguiente();
void P_Ind_Anterior();
void P_Ind_Busca();
void P_Ind_Crea();
void P_Ind_Inserta();

/*--------------------------------------------------------------------
 * Programa principal
 *------------------------------------------------------------------*/
void main()
  {
  int Opcion, Sigue=1;
  contador Fil, Col;

  Pan_Define (PAN_TEXTO);
  Azr_Inicia();
  while ( Sigue )
    {
    Pan_Color (NEGRO,BLANCO);
    Pan_Limpia();
    Fil = 0, Col = 3;
    Pan_PonTexto (Fil++,Col,"Prueba del objeto Indice" );
    Pan_PonTexto (Fil++,Col,"========================" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"0. Fin del programa" );
    Pan_PonTexto (Fil++,Col,"1. Paso a grfico" );
    Pan_PonTexto (Fil++,Col,"2. Paso a texto" );
    Pan_PonTexto (Fil++,Col,"3. Ind_Abre()" );
    Pan_PonTexto (Fil++,Col,"4. Ind_Primero()" );
    Pan_PonTexto (Fil++,Col,"5. Ind_Ultimo()" );
    Pan_PonTexto (Fil++,Col,"6. Ind_Siguiente()" );
    Pan_PonTexto (Fil++,Col,"7. Ind_Anterior()" );
    Pan_PonTexto (Fil++,Col,"8. Ind_Busca()" );
    Pan_PonTexto (Fil++,Col,"9. Ind_Crea()" );
    Col--;
    Pan_PonTexto (Fil++,Col,"10. Ind_Inserta()" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"Introduce nmero de opcin: " );
    scanf ( "%d", &Opcion );
    getchar();

    switch ( Opcion )
      {
      case 0:   Sigue = 0;               break;
      case 1:   Pan_Cierra();
                Pan_Define (PAN_GRAFICO);
                break;
      case 2:   Pan_Cierra();
                Pan_Define (PAN_TEXTO);
                break;
      case 3:   P_Ind_Abre();      break;
      case 4:   P_Ind_Primero();   break;
      case 5:   P_Ind_Ultimo();    break;
      case 6:   P_Ind_Siguiente(); break;
      case 7:   P_Ind_Anterior();  break;
      case 8:   P_Ind_Busca();     break;
      case 9:   P_Ind_Crea();      break;
      case 10:  P_Ind_Inserta();   break;
      }
    }
  Pan_Cierra();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Abre()
 *------------------------------------------------------------------*/
void P_Ind_Abre()
  {
  cadena   NombreFich, NombreInfo;
  fichero  Info;
  indice   Indice;
  caracter Aux[80];
  entero   Pagina;
  contador i;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Abre()");

  NombreFich = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Estudio el fichero ");
  Pan_Texto (NombreFich);

  NombreInfo = Fch_Nombre ("Vind","txt");
  if ( Info = Fch_AbreGrabar (NombreInfo, FCH_TEXTO) )
    {
    sprintf (Aux, "Estudio del fichero %s", NombreFich);
    Fch_EscribeLinea (Info,Aux);
    Fch_EscribeLinea (Info,"");
    if ( Indice = Ind_Abre (NombreFich, IND_LECTURA) )
      {
      Ind_PonNivel (Indice,0);
      Fch_EscribeLinea (Info,"Cabecera del fichero");
      sprintf (Aux, "Desplazamiento a raiz: %ld", Ind_Posicion(Indice));
      Fch_EscribeLinea (Info,Aux);
      sprintf (Aux, "Longitud de la clave: %d", Ind_LongitudClave(Indice));
      Fch_EscribeLinea (Info,Aux);
      sprintf (Aux, "Claves por pgina: %d", Ind_ClavesPagina(Indice));
      Fch_EscribeLinea (Info,Aux);

      Pan_PonTexto (4,0,"Viendo pgina:");
      for ( Pagina=1 ; Ind_LeePagina (Indice, Pagina*IND_PAGINA) ;
            Pagina++ )
        {
        Pan_PonEntero (4,15,Pagina,2);
        Fch_EscribeLinea (Info,"");
        Fch_EscribeLinea (Info,"");
        sprintf (Aux, "Pgina #%d",Pagina);
        Fch_EscribeLinea (Info,Aux);
        Fch_EscribeLinea (Info,"");
        sprintf (Aux, "Items en la pgina: %d",Ind_MaxItem(Indice));
        Fch_EscribeLinea (Info,Aux);
        for ( i=0 ; i<Ind_MaxItem(Indice) ; i++ )
          {
          sprintf (Aux,
          "Item #%d -> Desplazamiento: %d. Pgina: %ld. Registro: %ld",
           i, Ind_Desplazamiento(Indice,i), Ind_PaginaApuntada(Indice,i),
           Ind_Registro(Indice,i) );
          Fch_EscribeLinea (Info,Aux);
          Fch_EscribeLinea (Info,Ind_Clave(Indice,i,Aux));
          Fch_EscribeLinea (Info,"");
          }
        sprintf (Aux, "Siguiente pgina: %ld",
                 Ind_PaginaApuntada (Indice,Ind_MaxItem(Indice)));
        Fch_EscribeLinea (Info,Aux);
        }
      Ind_Cierra (Indice);
      } /* Fin if (Indice) */

    Fch_Cierra (Info);
    Pan_PonTexto (6,0,"Mira el fichero ");
    Pan_Texto (NombreInfo);
    } /* Fin if (Info) */

  Cad_Destruye (NombreFich);
  Cad_Destruye (NombreInfo);

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Primero()
 *------------------------------------------------------------------*/
void P_Ind_Primero()
  {
  cadena NombreFich, Clave;
  indice Indice;
  entero Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Primero()");

  NombreFich = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Primer ndice del fichero ");
  Pan_Texto (NombreFich);

  if ( Indice = Ind_Abre (NombreFich, IND_LECTURA) )
    {
    Clave = Cad_Crea (Ind_LongitudClave(Indice));
    if ( Ind_Primero (Indice, &Numero, Clave) )
      {
      Pan_PonTexto (4,0,"Nmero de registro: ");
      Pan_Entero (Numero,4);
      Pan_PonTexto (6,0,"Clave: ");
      Pan_Color (ROJO,BLANCO);
      Pan_Texto (Clave);
      }
    else { Pan_PonTexto (4,0,"No se encuentra"); }
    Cad_Destruye (Clave);
    Ind_Cierra (Indice);
    }

  Cad_Destruye (NombreFich);

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Ultimo()
 *------------------------------------------------------------------*/
void P_Ind_Ultimo()
  {
  cadena NombreFich, Clave;
  indice Indice;
  entero Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Ultimo()");

  NombreFich = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Ultimo ndice del fichero ");
  Pan_Texto (NombreFich);

  if ( Indice = Ind_Abre (NombreFich, IND_LECTURA) )
    {
    Clave = Cad_Crea (Ind_LongitudClave(Indice));
    if ( Ind_Ultimo (Indice, &Numero, Clave) )
      {
      Pan_PonTexto (4,0,"Nmero de registro: ");
      Pan_Entero (Numero,4);
      Pan_PonTexto (6,0,"Clave: ");
      Pan_Color (ROJO,BLANCO);
      Pan_Texto (Clave);
      }
    else { Pan_PonTexto (4,0,"No se encuentra"); }
    Cad_Destruye (Clave);
    Ind_Cierra (Indice);
    }

  Cad_Destruye (NombreFich);

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Siguiente()
 *------------------------------------------------------------------*/
void P_Ind_Siguiente()
  {
  cadena   NombreFich, Clave;
  indice   Indice;
  entero   Numero, Total=0;
  contador i;
  logico   Sigue;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Siguiente()");

  NombreFich = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Indices consecutivos del fichero ");
  Pan_Texto (NombreFich);

  if ( Indice = Ind_Abre (NombreFich, IND_LECTURA) )
    {
    Clave = Cad_Crea (Ind_LongitudClave(Indice));
    for ( i=0 , Sigue = Ind_Siguiente (Indice, &Numero, Clave) ;
          Sigue ; 
          i++ , Sigue = Ind_Siguiente (Indice, &Numero, Clave) , Total++ )
      {
      Pan_PonEntero (i+4,0,Numero,4);
      Pan_PonTexto (i+4,6,Clave);
      Pan_Entero (Ind_Posicion(Indice)/IND_PAGINA,1);
      if ( i==16 )
        {
        Usr_PulsaUnaTecla ("Hay ms ndices");
        Pan_Color (NEGRO,BLANCO);
        Pan_Borra (NEGRO,4,0,20,79);
        i=-1;
        }
      }

    Pan_PonTexto (0, 40, "Total: ");
    Pan_Entero (Total,1);

    Cad_Destruye (Clave);
    Ind_Cierra (Indice);
    }

  Cad_Destruye (NombreFich);

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Anterior()
 *------------------------------------------------------------------*/
void P_Ind_Anterior()
  {
  cadena   NombreFich, Clave;
  indice   Indice;
  entero   Numero, Total=0;
  contador i;
  logico   Sigue;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Anterior()");

  NombreFich = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Indices consecutivos inversos del fichero ");
  Pan_Texto (NombreFich);

  if ( Indice = Ind_Abre (NombreFich, IND_LECTURA) )
    {
    Clave = Cad_Crea (Ind_LongitudClave(Indice));
    for ( i=0 , Sigue = Ind_Anterior (Indice, &Numero, Clave) ;
          Sigue ; 
          i++ , Sigue = Ind_Anterior (Indice, &Numero, Clave) , Total++ )
      {
      Pan_PonEntero (i+4,0,Numero,4);
      Pan_PonTexto (i+4,6,Clave);
      Pan_Entero (Ind_Posicion(Indice)/IND_PAGINA,1);
      if ( i==16 )
        {
        Usr_PulsaUnaTecla ("Hay ms ndices");
        Pan_Color (NEGRO,BLANCO);
        Pan_Borra (NEGRO,4,0,20,79);
        i=-1;
        }
      }

    Pan_PonTexto (0, 40, "Total: ");
    Pan_Entero (Total,1);

    Cad_Destruye (Clave);
    Ind_Cierra (Indice);
    }

  Cad_Destruye (NombreFich);

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Busca()
 *------------------------------------------------------------------*/
void P_Ind_Busca()
  {
  cadena   NombreFich, Clave, Aux;
  indice   Indice;
  entero   Numero;
  contador i;
  logico   Sigue;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Busca()");

  NombreFich = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Buscamos clave en el fichero ");
  Pan_Texto (NombreFich);

  if ( Indice = Ind_Abre (NombreFich, IND_LECTURA) )
    {
    Clave = Cad_Crea (Ind_LongitudClave(Indice));

    Pan_PonTexto (4,0,"Introduce clave para buscar: ");
    Aux = Usr_Texto ("", 30, 6, 0, BLANCO, NEGRO);
    
    if ( Tec_Ultima() != TEC_ESC )
      {
      Cad_Copia (Clave, Aux);

      Pan_Color (NEGRO,BLANCO);
      if ( Ind_Busca (Indice, &Numero, Clave, Cad_Compara) )
        {
        Pan_PonTexto (8,0,"Clave encontrada:");
        Pan_PonTexto (10,0,Clave);
        }
      else
        { Pan_PonTexto (8,0,"No se encuentra clave"); }
      Cad_Destruye (Clave);
      }              
      
    Cad_Destruye (Aux);
    Ind_Cierra (Indice);
    }

  Cad_Destruye (NombreFich);

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Crea()
 *------------------------------------------------------------------*/
void P_Ind_Crea()
  {
  static cadena   Nombre[]   = { "PALABRA", NIL };
  static char     Tipo[]     = { 'C' };
  static contador Longitud[] = { 50 };
  static contador Decimal[]  = {  0 };

  cadena   NombreBase, NombreIndice;
  basedato Base;
  indice   Indice;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Crea()");

  NombreBase = Fch_Nombre ("Vind","dbf");
  NombreIndice = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Creando la base de datos Vind");

  Base = Bdt_Crea (NombreBase, Nombre, Tipo, Longitud, Decimal);
  Indice = Ind_Crea (NombreIndice, "Palabra", 50, 0);

  if ( Base && Indice ) { Pan_PonTexto (4,0,"Creada."); }
  else                  { Pan_PonTexto (4,0,"No se ha creado."); }

  Cad_Destruye (NombreBase);
  Cad_Destruye (NombreIndice);

  if ( Base )  { Bdt_Cierra (Base); }

  if ( Indice )
    {
    Pan_Color (NEGRO,BLANCO);
    Ind_PonNivel (Indice, 0);
    Pan_PonTexto (4,0, "Desplazamiento a raiz: ");
    Pan_Entero (Ind_Posicion(Indice),1);
    Pan_PonTexto (5,0, "Longitud de la clave: ");
    Pan_Entero (Ind_LongitudClave(Indice),1);
    Pan_PonTexto (6,0, "Claves por pgina: ");
    Pan_Entero (Ind_ClavesPagina(Indice),1);
    Ind_Cierra (Indice);
    }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Ind_Inserta()
 *------------------------------------------------------------------*/
void P_Ind_Inserta()
  {
  static cadena Letra = "abcdefghijklmnopqrstuvwxyz";

  cadena   NombreBase, NombreIndice;
  basedato Base;
  indice   Indice;
  caracter Palabra[51];
  contador TotalInsercion, LongPalabra, i, j;
  entero   Registro;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Ind_Inserta()");

  NombreBase = Fch_Nombre ("Vind","dbf");
  NombreIndice = Fch_Nombre ("Vind","ntx");
  Pan_PonTexto (2,0,"Insertando en la base de datos Vind");

  Base = Bdt_Abre (NombreBase, BDT_ACTUALIZACION);
  Indice = Ind_Abre (NombreIndice, IND_ACTUALIZACION);

  if ( Base && Indice )
    {
    Pan_PonTexto (4,0,"Abierta.");
    Pan_PonTexto (6,0,"Nmero de registros para insertar:");
    TotalInsercion = Usr_Entero (1,3,1,200,6,35,ROJO,BLANCO);
    if ( Tec_Ultima() != TEC_ESC )
      {
      Pan_PonTexto (8,0,"Insertando registro");
      for ( i=0 ; i<TotalInsercion ; i++ )
        {
        Pan_Color (NEGRO, BLANCO);
        Pan_PonEntero (8, 20, i+1, 1);
        LongPalabra = Azr_Entero(5,50);
        for ( j=0 ; j<LongPalabra ; j++ )
          { Palabra[j] = Letra[Azr_Entero(0,Cad_Longitud(Letra)-1)]; }
        Palabra[j] = NULO;
  
        Pan_BorraLinea (10);
        Pan_Color (ROJO, BLANCO);
        Pan_PonTexto (10,0,Palabra);

        Bdt_LimpiaRegistro (Base);                          
        Bdt_PonCampoNumero (Base,0,Palabra);
        Bdt_AgregaRegistro (Base, &Registro);
        Ind_Inserta (Indice, Registro, Palabra, Cad_Compara);
        }
      }
    }

  else  { Pan_PonTexto (4,0,"No se ha abierto."); }

  Cad_Destruye (NombreBase);
  Cad_Destruye (NombreIndice);

  if ( Base )  { Bdt_Cierra (Base); }
  if ( Indice )  { Ind_Cierra (Indice); }

  Pan_Color (NEGRO,BLANCO);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }
