First commit 31/01/1996
This commit is contained in:
		
							
								
								
									
										734
									
								
								BDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										734
									
								
								BDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,734 @@
 | 
			
		||||
#include <io.h>
 | 
			
		||||
#include <mem.h>
 | 
			
		||||
#include <alloc.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#define __BDatos_CPP
 | 
			
		||||
#include "d:\program\src_dos\libs\bdatos\BDatos.hh"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//                   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
#define PROG_NAME    "BDatos::JD::"
 | 
			
		||||
//                   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
#define VER_HI     1
 | 
			
		||||
#define VER_LOW    0
 | 
			
		||||
#define ARCH_LEN  12
 | 
			
		||||
 | 
			
		||||
#define FALSO      0
 | 
			
		||||
#define CIERTO     1
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
 char code;
 | 
			
		||||
 long  pos;
 | 
			
		||||
} BTree;
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Contructor de Clase                                                        |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Se encarga de poner a cero todas las variables utilizadas     |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
BDatos::BDatos()
 | 
			
		||||
{
 | 
			
		||||
	   BDatosHeader.NRegistros =       0;
 | 
			
		||||
	   BDatosHeader.NRegTotal  =       0;
 | 
			
		||||
	   BDatosHeader.SizeReg    =       0;
 | 
			
		||||
	   BDatosHeader.VerHi      =  VER_HI;
 | 
			
		||||
	   BDatosHeader.VerLow     = VER_LOW;
 | 
			
		||||
	   BDatosHeader.Eof_Code   =      26;
 | 
			
		||||
 | 
			
		||||
	   strcpy( BDatosHeader.NBD, "BDatos::JD::" );
 | 
			
		||||
 | 
			
		||||
	   memset( BDatosHeader.MyHeader.ProgName, 32, sizeof(char)* 15 );
 | 
			
		||||
	   BDatosHeader.MyHeader.VerHi  =  0;
 | 
			
		||||
	   BDatosHeader.MyHeader.VerLow =  0;
 | 
			
		||||
 | 
			
		||||
	   memset( BDatosHeader.MyHeader.Other,    32, sizeof(char)*200 );
 | 
			
		||||
 | 
			
		||||
	   NRegActual =     0;
 | 
			
		||||
	   lError     =  0x00;
 | 
			
		||||
	   *cError    =  0x00;
 | 
			
		||||
	   rError     = ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Destructor de clase                                                        |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Finaliza las operaciones pendientes.                          |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  (ninguno)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
BDatos::~BDatos()
 | 
			
		||||
{
 | 
			
		||||
  if ( rError == ERROR ) return;
 | 
			
		||||
  fclose( handle_BDatos );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Registros                                                                  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Obtiene el n<>mero de registros total de la base de datos.     |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   numero de registros                                             |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
long BDatos::Registros(void)
 | 
			
		||||
{
 | 
			
		||||
 return BDatosHeader.NRegistros;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| NRegTotal                                                                  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Obtiene el n<>mero de registros total, total del la base.      |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   numero de registros                                             |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
long BDatos::NRegTotal(void)
 | 
			
		||||
{
 | 
			
		||||
 return BDatosHeader.NRegTotal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| RegActual                                                                  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Obtiene el n<>mero de registro actual.                         |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   numero de registro en tratamiento                               |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
long BDatos::RegActual(void)
 | 
			
		||||
{
 | 
			
		||||
 return NRegActual;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| AbrirReg                                                                   |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Abre los ficheros indices y datos.                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  nombre fichero "sin comodines"                                  |
 | 
			
		||||
|            longitud de un registro "en bytes"                              |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   OK       ( todo va bien )                                       |
 | 
			
		||||
|            ERROR    ( error        )                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
int BDatos::AbrirReg(char *file, long sizereg)
 | 
			
		||||
{
 | 
			
		||||
//  char bdatos[ARCH_LEN];
 | 
			
		||||
  char *bdatos;
 | 
			
		||||
 | 
			
		||||
  bdatos = file;
 | 
			
		||||
 | 
			
		||||
  BDatosHeader.MyHeader = MyHeader;
 | 
			
		||||
 | 
			
		||||
  Header NewHeader = BDatosHeader;
 | 
			
		||||
 | 
			
		||||
  rError = OK;
 | 
			
		||||
 | 
			
		||||
  strncpy( bdatos, file, ARCH_LEN );
 | 
			
		||||
 | 
			
		||||
  if ( (handle_BDatos = fopen( bdatos, "r+b" ) ) == NULL )
 | 
			
		||||
   {
 | 
			
		||||
     // Inicializamos una nueva base de datos
 | 
			
		||||
     if ( (handle_BDatos = fopen( bdatos, "w" ) ) == NULL )
 | 
			
		||||
      {
 | 
			
		||||
       lError = 0x01;           ObtenError( lError );
 | 
			
		||||
       return (rError = ERROR);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
     rewind( handle_BDatos );
 | 
			
		||||
     BDatosHeader.SizeReg = sizereg;
 | 
			
		||||
     fwrite( &BDatosHeader, sizeof( BDatosHeader ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
     fclose( handle_BDatos );
 | 
			
		||||
 | 
			
		||||
     if ( (handle_BDatos = fopen( bdatos, "r+b" ) ) == NULL )
 | 
			
		||||
     {
 | 
			
		||||
       lError = 0x01;           ObtenError( lError );
 | 
			
		||||
       return (rError = ERROR);
 | 
			
		||||
     }
 | 
			
		||||
   } else {
 | 
			
		||||
 | 
			
		||||
    rewind( handle_BDatos );
 | 
			
		||||
    fread( &BDatosHeader, sizeof(BDatosHeader), 1, handle_BDatos);
 | 
			
		||||
 | 
			
		||||
    if ( BDatosHeader.SizeReg != sizereg || BDatosHeader.VerHi != NewHeader.VerHi )
 | 
			
		||||
    {
 | 
			
		||||
			       lError = 0x03;           ObtenError( lError );
 | 
			
		||||
			       fclose( handle_BDatos );
 | 
			
		||||
			       return (rError = ERROR);
 | 
			
		||||
    }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| CerrarReg                                                                  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Cierra la base de datos.                                      |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  (ninguno)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   OK       ( todo va bien )                                       |
 | 
			
		||||
|            ERROR    ( error        )                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
void BDatos::CerrarReg( void )
 | 
			
		||||
{
 | 
			
		||||
  if ( rError == ERROR ) return;
 | 
			
		||||
  fclose( handle_BDatos );
 | 
			
		||||
  rError = ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| LeeReg                                                                     |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Lee el registro de la posici<63>n 'pos' y lo almacena en 'dato'  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  puntero a los datos                                             |
 | 
			
		||||
|            posicion a leer                                                 |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   OK       ( todo va bien )                                       |
 | 
			
		||||
|            ERROR    ( error        )                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
int  BDatos::LeeReg( void *dato, long pos )
 | 
			
		||||
{
 | 
			
		||||
  BTree  inx;
 | 
			
		||||
 | 
			
		||||
  if ( rError == ERROR )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x05;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  if ( pos > BDatosHeader.NRegistros || pos < 0 )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x04;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  NRegActual = pos;
 | 
			
		||||
  fseek( handle_BDatos, (long)( pos * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
  fread(          &inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  if ( inx.pos < 0 || inx.code != ' ' )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x04;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  fseek( handle_BDatos, (long)(  inx.pos * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET );
 | 
			
		||||
  fread (        dato, BDatosHeader.SizeReg, 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| EscribeReg                                                                 |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Escribe el registro en la posici<63>n 'pos' de  'dato'           |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  puntero a los datos                                             |
 | 
			
		||||
|            posicion a escribir                                             |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   OK       ( todo va bien )                                       |
 | 
			
		||||
|            ERROR    ( error        )                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
int BDatos::EscribeReg( void *dato, long pos )
 | 
			
		||||
{
 | 
			
		||||
  BTree  inx;
 | 
			
		||||
 | 
			
		||||
  if ( rError == ERROR )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x05;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  if ( pos > BDatosHeader.NRegistros || pos < 0 )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x04;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  NRegActual = pos;
 | 
			
		||||
  fseek( handle_BDatos, (long)( pos * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
  fread(          &inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  if (   inx.pos < 0 ||   inx.code != ' ' )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x04;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  fseek( handle_BDatos, (long)(  inx.pos * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET );
 | 
			
		||||
  fwrite(        dato, BDatosHeader.SizeReg, 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| InsReg                                                                     |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Inserta un registro, en la posici<63>n 'pos' por arriba o abajo  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  puntero a los datos a insertar, posici<63>n, ARRIBA o ABAJO        |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
int BDatos::InsReg( void *dato, long pos, char ab )
 | 
			
		||||
{
 | 
			
		||||
  BTree inx, old_inx;
 | 
			
		||||
  unsigned long avance;
 | 
			
		||||
  long RegTot;
 | 
			
		||||
 | 
			
		||||
  if ( rError == ERROR )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x05;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  // Filtro los datos conflictivos
 | 
			
		||||
  if ( pos == 0 && BDatosHeader.NRegistros == 1 && ab == ARRIBA )
 | 
			
		||||
  {
 | 
			
		||||
   pos = 1;
 | 
			
		||||
  } else
 | 
			
		||||
  if ( pos == (BDatosHeader.NRegistros - 1) && ab == ARRIBA )
 | 
			
		||||
  {
 | 
			
		||||
   pos = BDatosHeader.NRegistros;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  BDatosHeader.NRegistros++;
 | 
			
		||||
  if ( pos > (BDatosHeader.NRegistros-1) || pos < 0 )
 | 
			
		||||
//  if ( pos >= (BDatosHeader.NRegistros-1) && BDatosHeader.NRegistros!=1 )
 | 
			
		||||
   {
 | 
			
		||||
    BDatosHeader.NRegistros--;
 | 
			
		||||
    lError = 0x04;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  // Si hay fichas eliminadas, utilizamos sus direcciones intermedias.
 | 
			
		||||
  if ( (BDatosHeader.NRegTotal - ( BDatosHeader.NRegistros - 1 ) ) > 0 )
 | 
			
		||||
  {
 | 
			
		||||
   fseek( handle_BDatos, (long)( ( BDatosHeader.NRegistros - 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
   fread(      &old_inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
  } else {
 | 
			
		||||
   old_inx.pos = ( BDatosHeader.NRegistros - 1 );
 | 
			
		||||
   BDatosHeader.NRegTotal++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
// |<---------- RegTot ----------->|
 | 
			
		||||
// |<----- NRegistros ---->|       |
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
//
 | 
			
		||||
// 2 up  <20>pos+1
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> 2 <20> * <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
// 2 down <20>pos
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> * <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
 avance = ( BDatosHeader.NRegistros - 1 );
 | 
			
		||||
 while ( avance > ( pos + ab ) )
 | 
			
		||||
 {
 | 
			
		||||
  fseek( handle_BDatos, (long)( ( avance - 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
  fread(         &inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  fseek( handle_BDatos, (long)( ( avance     ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
  fwrite(        &inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  avance--;
 | 
			
		||||
 };
 | 
			
		||||
 | 
			
		||||
 if ( ( BDatosHeader.NRegistros - 1 ) == 0 )
 | 
			
		||||
   fseek( handle_BDatos, sizeof( Header ), SEEK_SET);
 | 
			
		||||
 else {
 | 
			
		||||
   ab = ( ( BDatosHeader.NRegistros - 1 ) <= ( pos + ab ) ) ? 0 : ab;
 | 
			
		||||
   fseek( handle_BDatos, (long)( ( pos + ab ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 NRegActual = ( BDatosHeader.NRegistros - 1 ) == 0 ? 0 : pos + ab;
 | 
			
		||||
 old_inx.code = ' ';
 | 
			
		||||
 fwrite(       &old_inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
 fseek( handle_BDatos, (long)( ( old_inx.pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET );
 | 
			
		||||
 fwrite( dato, BDatosHeader.SizeReg, 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
 rewind( handle_BDatos );
 | 
			
		||||
 fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
 return OK;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| DelReg                                                                     |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Borra un registro, de la posici<63>n 'pos'                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  posici<63>n a borrar                                               |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
int BDatos::DelReg( long pos )
 | 
			
		||||
{
 | 
			
		||||
  BTree inx, old_inx;
 | 
			
		||||
 | 
			
		||||
  if ( rError == ERROR )
 | 
			
		||||
   {
 | 
			
		||||
    lError = 0x05;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  BDatosHeader.NRegistros--;
 | 
			
		||||
  if ( pos > BDatosHeader.NRegistros || pos < 0)
 | 
			
		||||
   {
 | 
			
		||||
    BDatosHeader.NRegistros++;
 | 
			
		||||
    lError = 0x04;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
  fseek( handle_BDatos, (long)( (     pos     ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header )  ), SEEK_SET );
 | 
			
		||||
  fread(      &old_inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
// |<---------- RegTot ----------->|
 | 
			
		||||
// |<----- NRegistros ---->|       |
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
 unsigned long avance;
 | 
			
		||||
 | 
			
		||||
 avance = pos;
 | 
			
		||||
 while ( avance < BDatosHeader.NRegistros )
 | 
			
		||||
 {
 | 
			
		||||
  fseek ( handle_BDatos, (long)( ( avance + 1 ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header )  ), SEEK_SET );
 | 
			
		||||
  fread (          &inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  fseek ( handle_BDatos, (long)( ( avance     ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header )  ), SEEK_SET );
 | 
			
		||||
  fwrite(          &inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  avance++;
 | 
			
		||||
 };
 | 
			
		||||
 | 
			
		||||
  NRegActual = BDatosHeader.NRegistros == 1 ? 0 : ( BDatosHeader.NRegistros - 1);
 | 
			
		||||
  fseek( handle_BDatos, (long)( ( BDatosHeader.NRegistros   ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header )  ), SEEK_SET );
 | 
			
		||||
 | 
			
		||||
  old_inx.code = '*';
 | 
			
		||||
  fwrite(   &old_inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  rewind( handle_BDatos );
 | 
			
		||||
  fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| ShortReg                                                                   |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Corta el fichero y lo hace mas peque<75>o.                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
int BDatos::ShortReg(void)
 | 
			
		||||
{
 | 
			
		||||
 long avance, recorrido;
 | 
			
		||||
 BTree inx, curr_inx;
 | 
			
		||||
 void *SWAPdatos;
 | 
			
		||||
 char enc;
 | 
			
		||||
 | 
			
		||||
 if ( ( BDatosHeader.NRegTotal - BDatosHeader.NRegistros ) <= 0 ) return OK;
 | 
			
		||||
 | 
			
		||||
 if ( ( SWAPdatos = calloc( 1, BDatosHeader.SizeReg ) ) == NULL )
 | 
			
		||||
 {
 | 
			
		||||
    lError = 0x07;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 avance = BDatosHeader.NRegTotal-1;
 | 
			
		||||
 while( avance >=  BDatosHeader.NRegistros )
 | 
			
		||||
  {
 | 
			
		||||
    // Obtengo la direcci<63>n del campo que est<73> libre y el dato.
 | 
			
		||||
    fseek( handle_BDatos, (long)( ( avance  ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
    fread(         &inx,      sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
    fread(    SWAPdatos, BDatosHeader.SizeReg, 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
    // Busco la direcci<63>n del indice para la ficha actual.
 | 
			
		||||
    recorrido = avance;   enc = FALSO;
 | 
			
		||||
    while( recorrido >= 0 && !enc )
 | 
			
		||||
    {
 | 
			
		||||
     fseek( handle_BDatos, (long)( ( recorrido  ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
     fread(     &curr_inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
     if ( curr_inx.pos == avance )
 | 
			
		||||
                               enc = CIERTO;
 | 
			
		||||
     else
 | 
			
		||||
                               recorrido--;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Si alguien de fuera referencia a esa ficha...
 | 
			
		||||
    if ( enc )
 | 
			
		||||
    {
 | 
			
		||||
     curr_inx.pos = inx.pos;
 | 
			
		||||
     //Actualizo el indice para comunicarle la nueva posici<63>n.
 | 
			
		||||
     fseek( handle_BDatos, (long)( ( recorrido  ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
     fwrite(     &curr_inx, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
     // Pongo la ficha actual en la direcci<63>n libre.
 | 
			
		||||
     fseek ( handle_BDatos, (long)( ( curr_inx.pos ) * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) + sizeof( BTree ) ), SEEK_SET );
 | 
			
		||||
     fwrite(   SWAPdatos, BDatosHeader.SizeReg, 1, handle_BDatos );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
   avance--;
 | 
			
		||||
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  // Actualizo la base de registros
 | 
			
		||||
  NRegActual = BDatosHeader.NRegistros - 1;
 | 
			
		||||
  BDatosHeader.NRegTotal = BDatosHeader.NRegistros;
 | 
			
		||||
  rewind( handle_BDatos );
 | 
			
		||||
  fwrite( &BDatosHeader, sizeof( Header ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
  // Corto todo lo que sobra de fichero
 | 
			
		||||
  if ( chsize( fileno(handle_BDatos), (long)(sizeof( Header ) + ( BDatosHeader.NRegistros * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) )) ) == -1 )
 | 
			
		||||
  {
 | 
			
		||||
    lError = 0x08;           ObtenError( lError );
 | 
			
		||||
    return OK;		// Este error no es del todo grave, pero se avisa.
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 free( SWAPdatos );
 | 
			
		||||
 return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| ObtenError                                                                 |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Obtiene el error correspondiente al codigo dado.              |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas:  codigo de error                                                 |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   (ninguna)                                                       |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
void BDatos::ObtenError( int code )
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
 switch( code )
 | 
			
		||||
 {
 | 
			
		||||
  case 0x00:
 | 
			
		||||
	    strcpy( cError, "No hay errores" );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x01:
 | 
			
		||||
	    strcpy( cError, "Imposible inicializar base de datos" );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x02:
 | 
			
		||||
	    strcpy( cError, "No se puede abrir el fichero" );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x03:
 | 
			
		||||
	    strcpy( cError, "Version de fich. incompatible" );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x04:
 | 
			
		||||
	    strcpy( cError, "No se pudo acceder a esa posici<63>n." );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x05:
 | 
			
		||||
	    strcpy( cError, "No hay base de datos en uso..." );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x06:
 | 
			
		||||
	    strcpy( cError, "Tama<EFBFBD>os de estructuras no coinciden" );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x07:
 | 
			
		||||
	    strcpy( cError, "Memoria insuficiente. Operaci<63>n cancelada" );
 | 
			
		||||
	    break;
 | 
			
		||||
  case 0x08:
 | 
			
		||||
	    strcpy( cError, "Acceso de operacion no permitida." );
 | 
			
		||||
	    break;
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| SortReg                                                                    |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Descripcion:                                                               |
 | 
			
		||||
|              Ordena la base de datos seg<65>n especifique el usuario en su    |
 | 
			
		||||
|              funci<63>n fcmp...                                               |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Entradas: /**************************************************************\ |
 | 
			
		||||
|          | fcmp                                                           ||
 | 
			
		||||
|          |                                                                ||
 | 
			
		||||
|          | Descripcion:                                                   ||
 | 
			
		||||
|          |              funci<63>n de entrada a SortReg, debe ser realizada  ||
 | 
			
		||||
|          |              por el usuario y debe ce<63>irse a sus par<61>metros..  ||
 | 
			
		||||
|          |                                                                ||
 | 
			
		||||
|          | Entradas:    ptrs. a dos estructuras de usuario. ( ejm. A, B ) ||
 | 
			
		||||
|          | Salidas:     >> 0   si   A >> B                                ||
 | 
			
		||||
|          |              == 0   si   A == B                                ||
 | 
			
		||||
|          |              << 0   si   A << B                                ||
 | 
			
		||||
|           \**************************************************************  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
| Salidas:   ERROR   se cargan los registros con el codigo de error esp.     |
 | 
			
		||||
|            OK      todo ha ido bien                                        |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
int BDatos::SortReg( int (*fcmp)(const void *, const void *) )
 | 
			
		||||
{
 | 
			
		||||
 char dev;
 | 
			
		||||
 | 
			
		||||
 // Pido memoria para mantener dos elementos auxiliares
 | 
			
		||||
 if (
 | 
			
		||||
     ( A = calloc( 1, BDatosHeader.SizeReg ) ) == NULL ||
 | 
			
		||||
     ( B = calloc( 1, BDatosHeader.SizeReg ) ) == NULL
 | 
			
		||||
    )
 | 
			
		||||
 {
 | 
			
		||||
    lError = 0x07;           ObtenError( lError );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
 dev = SortRegi( fcmp, 0, BDatosHeader.NRegistros-1 );
 | 
			
		||||
 | 
			
		||||
 free(A); free(B);
 | 
			
		||||
 | 
			
		||||
 return dev;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int BDatos::SortRegi( int (*fcmp)(const void *, const void *), long izquierda, long derecha )
 | 
			
		||||
{
 | 
			
		||||
  BTree inx1, inx2;
 | 
			
		||||
  register long i, j;
 | 
			
		||||
 | 
			
		||||
     i = izquierda; j = derecha;
 | 
			
		||||
     if ( LeeReg( A, (long)(izquierda+derecha)/2 + 1 ) != OK )
 | 
			
		||||
     {
 | 
			
		||||
          lError = 0x04;           ObtenError( lError );
 | 
			
		||||
          return ERROR;
 | 
			
		||||
     }
 | 
			
		||||
 | 
			
		||||
     do {
 | 
			
		||||
     if ( LeeReg( B, i )!= OK )
 | 
			
		||||
     {
 | 
			
		||||
          lError = 0x04;           ObtenError( lError );
 | 
			
		||||
          return ERROR;
 | 
			
		||||
     }
 | 
			
		||||
       while( i < derecha && fcmp( B, A ) < 0 )
 | 
			
		||||
       {
 | 
			
		||||
          i++;
 | 
			
		||||
          if ( LeeReg( B, i ) != OK )
 | 
			
		||||
          {
 | 
			
		||||
           lError = 0x04;           ObtenError( lError );
 | 
			
		||||
           return ERROR;
 | 
			
		||||
          }
 | 
			
		||||
       };
 | 
			
		||||
 | 
			
		||||
       LeeReg( B, j );
 | 
			
		||||
       while( j > izquierda && fcmp( A, B ) < 0 )
 | 
			
		||||
       {
 | 
			
		||||
          j--;
 | 
			
		||||
          if ( LeeReg( B, j ) != OK )
 | 
			
		||||
          {
 | 
			
		||||
           lError = 0x04;           ObtenError( lError );
 | 
			
		||||
           return ERROR;
 | 
			
		||||
          }
 | 
			
		||||
       };
 | 
			
		||||
 | 
			
		||||
       if ( i <= j )
 | 
			
		||||
       {
 | 
			
		||||
         // Intercambiamos solo los indices sin chequear si son
 | 
			
		||||
         // accesibles, ( si no lo fueran, se abria abortado )
 | 
			
		||||
         fseek( handle_BDatos, (long)( i * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
         fread(          &inx1, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
         fseek( handle_BDatos, (long)( j * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
         fread(          &inx2, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
         fseek( handle_BDatos, (long)( j * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
         fwrite(         &inx1, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
         fseek( handle_BDatos, (long)( i * ( sizeof( BTree ) + BDatosHeader.SizeReg  ) + sizeof( Header ) ), SEEK_SET );
 | 
			
		||||
         fwrite(         &inx2, sizeof( BTree ), 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
          i++; j--;
 | 
			
		||||
       }
 | 
			
		||||
 | 
			
		||||
     } while( i <= j );
 | 
			
		||||
 | 
			
		||||
 if ( izquierda < j )  SortRegi( fcmp, izquierda, j );
 | 
			
		||||
 if ( i < derecha   )  SortRegi( fcmp, i, derecha   );
 | 
			
		||||
 | 
			
		||||
 return OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								BDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								BDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										144
									
								
								BDATOS.HH
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								BDATOS.HH
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,144 @@
 | 
			
		||||
 /**************************************************************************\
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|  		Clase para el tratamiento de Bases de Datos                  |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                      Jos<6F> David Guill<6C>n 1996 (c)                           |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
|                                                                            |
 | 
			
		||||
 \**************************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if !defined(__BDatos_HH)
 | 
			
		||||
#define __BDatos_HH
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
 | 
			
		||||
#define OK      0
 | 
			
		||||
#define ERROR   1
 | 
			
		||||
#define NO_ENC -1
 | 
			
		||||
 | 
			
		||||
#define ARRIBA   1
 | 
			
		||||
#define ABAJO    0
 | 
			
		||||
 | 
			
		||||
#if !defined(__BDatos_CPP)
 | 
			
		||||
	#ifdef __cplusplus
 | 
			
		||||
	 extern "C" {
 | 
			
		||||
	#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 typedef struct
 | 
			
		||||
 {
 | 
			
		||||
  char ProgName[15];     // Estos datos se comprueban al abrir la base
 | 
			
		||||
  char VerHi, VerLow;    // para saber si es la adecuada para su progr.
 | 
			
		||||
 | 
			
		||||
  char Other[200];
 | 
			
		||||
 } YourHeader;
 | 
			
		||||
 | 
			
		||||
 typedef struct
 | 
			
		||||
 {
 | 
			
		||||
  char NBD[13];
 | 
			
		||||
  char Eof_Code;
 | 
			
		||||
  char VerHi, VerLow;
 | 
			
		||||
  YourHeader MyHeader;
 | 
			
		||||
  long NRegistros;
 | 
			
		||||
  long NRegTotal;
 | 
			
		||||
  long SizeReg;
 | 
			
		||||
 } Header;
 | 
			
		||||
 | 
			
		||||
 class BDatos {
 | 
			
		||||
 | 
			
		||||
  public:
 | 
			
		||||
 | 
			
		||||
     char lError;
 | 
			
		||||
     char cError[80];
 | 
			
		||||
     YourHeader MyHeader;
 | 
			
		||||
 | 
			
		||||
     void ObtenError(int code);                          // Obtiene el error "code"
 | 
			
		||||
     long Registros(void);                               // N<> de registros
 | 
			
		||||
     long NRegTotal(void);                               // N<> de registros
 | 
			
		||||
     long RegActual(void);                               // Reg. Actual
 | 
			
		||||
 | 
			
		||||
	  BDatos();					 // Constructor de Clase
 | 
			
		||||
	 ~BDatos();                                      // Destructor de Clase
 | 
			
		||||
     int  AbrirReg( char *file, long sizereg );          // Abre el Fichero
 | 
			
		||||
     void CerrarReg( void );                             // Cierra el Fich.
 | 
			
		||||
     int  EscribeReg( void *dato, long pos );            // Escribe un Dato
 | 
			
		||||
     int  LeeReg( void *dato, long pos );                // Lee un Dato
 | 
			
		||||
     int  InsReg( void *dato, long pos, char ab );       // Inserta un Reg en pos.
 | 
			
		||||
     int  DelReg( long pos );		                 // Borra un Reg de pos.
 | 
			
		||||
 | 
			
		||||
     int  ShortReg(void);				 // Corta el fich. y lo hace mas peque<75>o
 | 
			
		||||
 | 
			
		||||
                                                         // Ordena la Base
 | 
			
		||||
     int  SortReg( int (*fcmp)(const void *, const void *) );
 | 
			
		||||
                                                         // Busca un registro en una base ordenada
 | 
			
		||||
     int  BuscReg( long PosIni, int (*fcmp)(const void *, const void *) );
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
                                                         // Funcion auxiliar de ordenaci<63>n
 | 
			
		||||
     int   SortRegInt( long k, long n, int (*fcmp)(const void *, const void *));
 | 
			
		||||
 | 
			
		||||
	   FILE *handle_BDatos;                          // Handle a la Base
 | 
			
		||||
	   Header BDatosHeader;
 | 
			
		||||
	   long NRegActual;
 | 
			
		||||
	   char filename[80];
 | 
			
		||||
	   char rError;
 | 
			
		||||
 };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if !defined(__BDatos_CPP)
 | 
			
		||||
	#ifdef __cplusplus
 | 
			
		||||
	 }
 | 
			
		||||
	#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
   1   2   3   4   5   6   7   8   9   0
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
 <20> 2 <20> 3 <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
INS (2_3)
 | 
			
		||||
 (si existen archivos borrados: " (TotalRecords+1) mark * " coge su posicion )
 | 
			
		||||
 | 
			
		||||
   1   2   3   4   5   6   7   8   9   0
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
 <20> 2 <20> 3 <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>*X1<58>*X2<58>   <20>   <20>   <20>   <20>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
	   <20><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^ <20>
 | 
			
		||||
	   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
 <20> 2 <20> 3 <20> X2<58> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>*X2<58>   <20>   <20>   <20>   <20>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
 (si no existen archivos borrados: coge la posicion de Records + 1 )
 | 
			
		||||
 | 
			
		||||
   1   2   3   4   5   6   7   8   9   0
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
 <20> 2 <20> 3 <20> 6 <20> 7 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
	   <20><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^
 | 
			
		||||
 <20><>records = 7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
	  <20><><EFBFBD>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
 <20> 2 <20> 3 <20>7+1<> 6 <20> 7 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
	  <20><><EFBFBD>
 | 
			
		||||
DEL (3)
 | 
			
		||||
   1   2   3   4   5   6   7   8   9   0
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
 <20> 2 <20> 3 <20> X <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
	   <20>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>^<5E><><EFBFBD>  /.\
 | 
			
		||||
	   <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
 <20> 2 <20> 3 <20> 6 <20> 9 <20> 1 <20> 4 <20> 5 <20>*X <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
			     <20> Reg Mark *
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								BDATOS.PRJ
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								BDATOS.PRJ
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										190
									
								
								PDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								PDATOS.CPP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,190 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
int InsReg( long pos, char ab );
 | 
			
		||||
 | 
			
		||||
long NRegistros =  9;
 | 
			
		||||
 | 
			
		||||
char BTree_code[100] = {  '*', 32, 32, 32, 32, 32, 32, 32, 32, '*', '*', '*'};
 | 
			
		||||
long BTree_pos [100] = {  10,  2,  3,  4,  5,  6,  7,  8,  9,   0,   1,  11 };
 | 
			
		||||
long NRegTot =   12;
 | 
			
		||||
 | 
			
		||||
#define ARRIBA   1
 | 
			
		||||
#define ABAJO    0
 | 
			
		||||
#define OK      0
 | 
			
		||||
#define ERROR   1
 | 
			
		||||
#define NO_ENC -1
 | 
			
		||||
 | 
			
		||||
int DelReg( long pos );
 | 
			
		||||
 | 
			
		||||
void main(void)
 | 
			
		||||
{
 | 
			
		||||
 int pos, ab;
 | 
			
		||||
 pos = 0;
 | 
			
		||||
 printf("\n");
 | 
			
		||||
 while ( pos < NRegTot )
 | 
			
		||||
   { printf( " %c%d ", BTree_code[pos], BTree_pos[pos] ); pos++; }
 | 
			
		||||
 | 
			
		||||
 printf("\nIntroduzca posici<63>n, y metodo ( ARRIBA=1, ABAJO=0 ) --->");
 | 
			
		||||
 scanf( "%d %d", &pos, &ab );
 | 
			
		||||
 if ( ab < 0 || ab > 1 ) return;
 | 
			
		||||
 | 
			
		||||
// InsReg( pos, ab );
 | 
			
		||||
 DelReg( pos );
 | 
			
		||||
 pos = 0;
 | 
			
		||||
 printf("\n");
 | 
			
		||||
 while ( pos < NRegTot )
 | 
			
		||||
   { printf( " %c%d ", BTree_code[pos], BTree_pos[pos] );   pos++;   }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int InsReg( long pos, char ab )
 | 
			
		||||
{
 | 
			
		||||
  NRegistros++;
 | 
			
		||||
  if ( pos >= (NRegistros-1) && NRegistros != 1)
 | 
			
		||||
   {
 | 
			
		||||
    NRegistros--;
 | 
			
		||||
//    ObtenError( 0x04 );
 | 
			
		||||
    printf( "\nError registro no valido" );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
//  char RegTot;
 | 
			
		||||
  long dir_libre;
 | 
			
		||||
  char codigo;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  fseek( handle_BTree, 0L, SEEK_END );
 | 
			
		||||
  RegTot = ( ftell( handle_BTree ) - HeaderLen ) / ( sizeof(long) + sizeof(char) );
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
  // Si hay fichas eliminadas, utilizamos sus direcciones intermedias.
 | 
			
		||||
  if ( (NRegTot - ( NRegistros - 1 ) ) > 0 )
 | 
			
		||||
  {
 | 
			
		||||
   dir_libre = BTree_pos[NRegistros-1];
 | 
			
		||||
   codigo = BTree_code[NRegistros-1];
 | 
			
		||||
/*
 | 
			
		||||
   fseek( handle_BTree, ( ( sizeof(long) + sizeof(char) ) * ( NRegistros ) ) + Header_Len ), SEEK_SET );
 | 
			
		||||
   fread(   &dir_libre, sizeof(long), 1, handle_BTree );
 | 
			
		||||
   fread(      &codigo, sizeof(char), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
   // si la supuesta ficha eliminada, no lo esta, utilizamos la siguiente
 | 
			
		||||
   if ( codigo != '*' )
 | 
			
		||||
		dir_libre = NRegistros;
 | 
			
		||||
  } else
 | 
			
		||||
   dir_libre = ( NRegistros - 1 );
 | 
			
		||||
 | 
			
		||||
// |<---------- RegTot ----------->|
 | 
			
		||||
// |<----- NRegistros ---->|       |
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
//
 | 
			
		||||
// 2 up  <20>pos+1
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> 2 <20> * <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
// 2 down <20>pos
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> * <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
 | 
			
		||||
 unsigned long avance;
 | 
			
		||||
 avance = ( NRegistros - 1 );
 | 
			
		||||
 while ( avance > ( pos + ab ) )
 | 
			
		||||
 {
 | 
			
		||||
/*
 | 
			
		||||
  fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(avance-1))+HeaderLen, SEEK_SET);
 | 
			
		||||
  fread(      &dirch , sizeof(long), 1, handle_BTree );
 | 
			
		||||
  fread(      &codch , sizeof(char), 1, handle_BTree );
 | 
			
		||||
 | 
			
		||||
  fwrite(      &dirch , sizeof(long), 1, handle_BTree );
 | 
			
		||||
  fwrite(      &codch , sizeof(char), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
  BTree_code[avance] = BTree_code[avance-1];
 | 
			
		||||
  BTree_pos [avance] = BTree_pos [avance-1];
 | 
			
		||||
  avance--;
 | 
			
		||||
 }
 | 
			
		||||
 if ( ( NRegistros - 1 ) == 0 )
 | 
			
		||||
   //fseek( handle_BTree, HeaderLen, SEEK_SET);
 | 
			
		||||
   {BTree_code[0] = ' '; BTree_pos[0] = dir_libre;}
 | 
			
		||||
 else
 | 
			
		||||
  //fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(pos + ab))+HeaderLen, SEEK_SET);
 | 
			
		||||
   {BTree_code[pos+ab] = ' '; BTree_pos[pos+ab] = dir_libre;}
 | 
			
		||||
/*
 | 
			
		||||
 codch = ' ';
 | 
			
		||||
 fwrite(   &dir_libre, sizeof(long), 1, handle_BTree );
 | 
			
		||||
 fwrite(      &codch , sizeof(char), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
/*
 | 
			
		||||
 fseek( handle_BDatos, ( ( SizeReg*dir_libre ) + HeaderLen ), SEEK_SET );
 | 
			
		||||
 fwrite( datos, SizeReg, 1, handle_BDatos );
 | 
			
		||||
 | 
			
		||||
 fseek( handle_BTree, 14L, SEEK_SET );
 | 
			
		||||
 fwrite( &NRegistro, sizeof(long), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int DelReg( long pos )
 | 
			
		||||
{
 | 
			
		||||
  long old_dir;
 | 
			
		||||
  char new_cod;
 | 
			
		||||
/*
 | 
			
		||||
  NRegistros++;
 | 
			
		||||
  if ( pos >= (NRegistros-1) && NRegistros != 1)
 | 
			
		||||
*/
 | 
			
		||||
  NRegistros--;
 | 
			
		||||
  if ( pos >= (NRegistros+1) )
 | 
			
		||||
   {
 | 
			
		||||
    NRegistros++;
 | 
			
		||||
    printf( "\nError registro no valido\n" );
 | 
			
		||||
    return ERROR;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  fseek( handle_BTree, ( ( sizeof(long) + sizeof(char) ) * pos ) + Header_Len ), SEEK_SET );
 | 
			
		||||
  fread(   &old_dir, sizeof(long), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
  old_dir = BTree_pos[pos];
 | 
			
		||||
 | 
			
		||||
// |<---------- RegTot ----------->|
 | 
			
		||||
// |<----- NRegistros ---->|       |
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
 | 
			
		||||
// <20> 1 <20> 2 <20> 5 <20> 6 <20> 4 <20> 3 <20> * <20> * <20>   <20>   <20>   <20>   <20>   <20>
 | 
			
		||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
 unsigned long avance;
 | 
			
		||||
 | 
			
		||||
 avance = pos;
 | 
			
		||||
 while ( avance < (NRegistros /*+ 1*/) )
 | 
			
		||||
 {
 | 
			
		||||
/*
 | 
			
		||||
  fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(avance+1))+HeaderLen, SEEK_SET);
 | 
			
		||||
  fread(      &dirch , sizeof(long), 1, handle_BTree );
 | 
			
		||||
  fread(      &codch , sizeof(char), 1, handle_BTree );
 | 
			
		||||
  fseek( handle_BTree, ((sizeof(long)+sizeof(char))*( avance ))+HeaderLen, SEEK_SET);
 | 
			
		||||
  fwrite(      &dirch , sizeof(long), 1, handle_BTree );
 | 
			
		||||
  fwrite(      &codch , sizeof(char), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
  BTree_code[avance] = BTree_code[avance+1];
 | 
			
		||||
  BTree_pos [avance] = BTree_pos [avance+1];
 | 
			
		||||
  avance++;
 | 
			
		||||
 }
 | 
			
		||||
/*
 | 
			
		||||
  fseek( handle_BTree, ((sizeof(long)+sizeof(char))*(NRegistros+1))+HeaderLen, SEEK_SET);
 | 
			
		||||
 | 
			
		||||
  new_cod = '*';
 | 
			
		||||
  fwrite(   &old_dir, sizeof(long), 1, handle_BTree );
 | 
			
		||||
  fwrite(   &new_cod, sizeof(char), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
  BTree_code[avance] = '*';
 | 
			
		||||
  BTree_pos [avance] = old_dir;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  fseek ( handle_BTree, (sizeof(char)*14), SEEK_SET );
 | 
			
		||||
  fwrite( &NRegistros, sizeof(long), 1, handle_BTree );
 | 
			
		||||
*/
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								PDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								PDATOS.EXE
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										297
									
								
								PRUEBA.CPP
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								PRUEBA.CPP
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,297 @@
 | 
			
		||||
 /*************************************************************************\
 | 
			
		||||
|                                                                           |
 | 
			
		||||
| Programa para probar el buen funcionamiento de la libreria BDatos .(JD)   |
 | 
			
		||||
|                                                                           |
 | 
			
		||||
| 12.03.96                                                                  |
 | 
			
		||||
 \*************************************************************************/
 | 
			
		||||
#include <conio.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#include "BDatos.hh"
 | 
			
		||||
 | 
			
		||||
void Altas(void);
 | 
			
		||||
void Bajas(void);
 | 
			
		||||
void Listar(void);
 | 
			
		||||
void Modificar(void);
 | 
			
		||||
void MuestraMenu(void);
 | 
			
		||||
int  Busca( char *nombre );
 | 
			
		||||
void Insertar_Especial(void);
 | 
			
		||||
 | 
			
		||||
void RellenaBase(void);
 | 
			
		||||
int fcmp( const void *A, const void *B );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
 char nombre[15];
 | 
			
		||||
 char apellidos[50];
 | 
			
		||||
 long DNI;
 | 
			
		||||
 int  Grupo;
 | 
			
		||||
} DummyStruct;
 | 
			
		||||
 | 
			
		||||
DummyStruct dummy;
 | 
			
		||||
 | 
			
		||||
BDatos DummyBase;
 | 
			
		||||
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
  int ok = 0;
 | 
			
		||||
 | 
			
		||||
  strcpy( DummyBase.MyHeader.ProgName, "Dummy Prog..." );
 | 
			
		||||
  DummyBase.MyHeader.VerHi  = 1;
 | 
			
		||||
  DummyBase.MyHeader.VerLow = 0;
 | 
			
		||||
  if ( DummyBase.AbrirReg( "dummy.fil", sizeof( DummyStruct ) ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
         return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  do
 | 
			
		||||
  {
 | 
			
		||||
   MuestraMenu();
 | 
			
		||||
   switch( getch() )
 | 
			
		||||
   {
 | 
			
		||||
    // Altas
 | 
			
		||||
    case '1':
 | 
			
		||||
	     Altas();
 | 
			
		||||
	     break;
 | 
			
		||||
    // Bajas
 | 
			
		||||
    case '2':
 | 
			
		||||
	     Bajas();
 | 
			
		||||
	     break;
 | 
			
		||||
    // Modificaciones
 | 
			
		||||
    case '3':
 | 
			
		||||
	     Modificar();
 | 
			
		||||
	     break;
 | 
			
		||||
    // Listar
 | 
			
		||||
    case '4':
 | 
			
		||||
	     Listar();
 | 
			
		||||
	     break;
 | 
			
		||||
    // CortarRegistros
 | 
			
		||||
    case '5':
 | 
			
		||||
	     DummyBase.ShortReg();
 | 
			
		||||
	     break;
 | 
			
		||||
    // Altas
 | 
			
		||||
    case '6':
 | 
			
		||||
             Insertar_Especial();
 | 
			
		||||
	     break;
 | 
			
		||||
    // Ordena la base segun nombre
 | 
			
		||||
    case '7':
 | 
			
		||||
             DummyBase.SortReg( fcmp );
 | 
			
		||||
             break;
 | 
			
		||||
    case '8':
 | 
			
		||||
             RellenaBase();
 | 
			
		||||
             break;
 | 
			
		||||
 | 
			
		||||
    // Fin
 | 
			
		||||
    case '0':
 | 
			
		||||
	     ok = 1;
 | 
			
		||||
	     break;
 | 
			
		||||
 | 
			
		||||
   };
 | 
			
		||||
  }while( !ok );
 | 
			
		||||
 | 
			
		||||
  DummyBase.CerrarReg();
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MuestraMenu(void)
 | 
			
		||||
{
 | 
			
		||||
 clrscr();
 | 
			
		||||
 cprintf("  M E N <20>   P R I N C I P A L  \r\n");
 | 
			
		||||
 cprintf("-------------------------------\r\n");
 | 
			
		||||
 | 
			
		||||
 cprintf(" 1 Altas          <20> nReg:  %ld \r\n", DummyBase.Registros() );
 | 
			
		||||
 cprintf(" 2 Bajas          <20> nRegT: %ld \r\n", DummyBase.NRegTotal() );
 | 
			
		||||
 cprintf(" 3 Modificaciones <20> CReg:  %ld \r\n", DummyBase.RegActual() );
 | 
			
		||||
 cprintf(" 4 Listar         <20>     ---    \r\n");
 | 
			
		||||
 cprintf(" 5 Cortar Fichero <20> _-<2D> J.D <20>-_\r\n");
 | 
			
		||||
 cprintf("                  <20> <20>-_ F.V _-<2D>\r\n");
 | 
			
		||||
 cprintf(" 0 Salir al DOS   <20>     ---     \r\n");
 | 
			
		||||
 cprintf("                  <20> F R i      \r\n");
 | 
			
		||||
 cprintf(" 6 Ins. Especial  <20>  u e S     \r\n");
 | 
			
		||||
 cprintf(" 7 Ordenar Campo  <20>   T N i    \r\n");
 | 
			
		||||
 cprintf("                  <20>    u O V   \r\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RellenaBase(void)
 | 
			
		||||
{
 | 
			
		||||
 int ficha;
 | 
			
		||||
 | 
			
		||||
 cprintf("\r\nRellenando base con 800 fichas. Por favor, espere...");
 | 
			
		||||
 | 
			
		||||
 for( ficha=0; ficha<800; ficha++ )
 | 
			
		||||
 {
 | 
			
		||||
  sprintf( dummy.nombre, "P%03d", (800-ficha) );
 | 
			
		||||
  sprintf( dummy.apellidos, "P%03d", ficha );
 | 
			
		||||
  dummy.DNI = ficha;
 | 
			
		||||
  dummy.Grupo = ficha;
 | 
			
		||||
 | 
			
		||||
 // Inserta un Reg por arriba de pos.
 | 
			
		||||
 if ( DummyBase.InsReg( (void *)&dummy, ficha, ARRIBA ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
	 exit(1);
 | 
			
		||||
	}
 | 
			
		||||
 }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Altas(void)
 | 
			
		||||
{
 | 
			
		||||
 cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n");
 | 
			
		||||
 scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo );
 | 
			
		||||
 | 
			
		||||
 // Inserta un Reg por arriba de pos.
 | 
			
		||||
 if ( DummyBase.InsReg( (void *)&dummy, DummyBase.Registros(), ARRIBA ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
	 exit(1);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Insertar_Especial(void)
 | 
			
		||||
{
 | 
			
		||||
 int PorDonde, Adonde;
 | 
			
		||||
 | 
			
		||||
 cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n");
 | 
			
		||||
 scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo );
 | 
			
		||||
 fflush(stdin);
 | 
			
		||||
 | 
			
		||||
 cprintf("\r\nIntroduzca donde y por donde insertar (1==ARRIBA)(0==ABAJO): ");
 | 
			
		||||
 scanf( "%d %d", &Adonde, &PorDonde );
 | 
			
		||||
 fflush(stdin);
 | 
			
		||||
 | 
			
		||||
 PorDonde = ( PorDonde == 1 ) ? ARRIBA : ABAJO ;
 | 
			
		||||
 | 
			
		||||
 // Inserta un Reg por arriba de pos.
 | 
			
		||||
 if ( DummyBase.InsReg( (void *)&dummy, Adonde, PorDonde ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
 | 
			
		||||
         cprintf("\r\nRegistros aun abiertos, condici<63>n metaestable");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Bajas(void)
 | 
			
		||||
{
 | 
			
		||||
 char nombTMP[80];
 | 
			
		||||
 cprintf("\r\nIntroduzca nombre a eliminar: ");
 | 
			
		||||
 scanf( "%14s", nombTMP );
 | 
			
		||||
 | 
			
		||||
 if ( Busca( nombTMP ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
				cprintf( "\r\nFichero no se encuentra en la base" );
 | 
			
		||||
				getch();
 | 
			
		||||
				return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    if ( DummyBase.LeeReg( (void *)&dummy, DummyBase.RegActual() ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
	 exit(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    cprintf( "%14s  %40s  %5ld %5d\n\r", dummy.nombre, dummy.apellidos, dummy.DNI, dummy.Grupo );
 | 
			
		||||
 | 
			
		||||
    if ( getch() == 32 ) return;
 | 
			
		||||
 | 
			
		||||
 // Borra el registro de la posicion actual
 | 
			
		||||
 if ( DummyBase.DelReg( DummyBase.RegActual() ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
	 exit(1);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Modificar(void)
 | 
			
		||||
{
 | 
			
		||||
 char nombTMP[80];
 | 
			
		||||
 | 
			
		||||
 cprintf("\r\nIntroduzca nombre a modificar: ");
 | 
			
		||||
 scanf( "%14s", nombTMP );
 | 
			
		||||
 | 
			
		||||
 if ( Busca( nombTMP ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
				cprintf( "\r\nFichero no se encuentra en la base" );
 | 
			
		||||
				getch();
 | 
			
		||||
				return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 cprintf("\r\nIntroduzca: ( nombre, apellidos, DNI, Grupo ) \r\n");
 | 
			
		||||
 scanf( "%14s %49s %ld %d", dummy.nombre, dummy.apellidos, &dummy.DNI, &dummy.Grupo );
 | 
			
		||||
 | 
			
		||||
 // Escribe el Reg en la base
 | 
			
		||||
 if ( DummyBase.EscribeReg( (void *)&dummy, DummyBase.RegActual() ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
	 exit(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Listar( void )
 | 
			
		||||
{
 | 
			
		||||
 int i;
 | 
			
		||||
    cprintf( "    Nombre                        Apelidos                       D.N.I  Grupo \n\r" );
 | 
			
		||||
    cprintf( "------------------------------------------------------------------------------\n\r" );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 for( i=0; i<DummyBase.Registros(); i++ )
 | 
			
		||||
  {
 | 
			
		||||
    if ( DummyBase.LeeReg( (void *)&dummy, i ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
	 exit(1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    cprintf( "%14s  %40s  %5ld %5d\n\r", dummy.nombre, dummy.apellidos, dummy.DNI, dummy.Grupo );
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  getch();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int Busca( char *nombre )
 | 
			
		||||
{
 | 
			
		||||
 int i, enc = ERROR;
 | 
			
		||||
 | 
			
		||||
 for( i=0; i<DummyBase.Registros() && enc != OK; i++ )
 | 
			
		||||
  {
 | 
			
		||||
    if ( DummyBase.LeeReg( (void *)&dummy, i ) != OK )
 | 
			
		||||
	{
 | 
			
		||||
	 cprintf("\r\nSe producio un error: %d", DummyBase.lError );
 | 
			
		||||
	 cprintf("\r\n%s\r\n", DummyBase.cError );
 | 
			
		||||
	 DummyBase.CerrarReg();
 | 
			
		||||
	 exit(1);
 | 
			
		||||
	}
 | 
			
		||||
    if ( strcmp( dummy.nombre, nombre ) == 0 )
 | 
			
		||||
						enc = OK;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return enc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int fcmp( const void *A, const void *B )
 | 
			
		||||
{
 | 
			
		||||
 return strcmp( ((DummyStruct *)A) -> nombre, ((DummyStruct *)B) -> nombre );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user